Какие расширения GNU C доступны, которые не тривиальны для реализации в C99?

как ядро Linux может компилироваться только с GCC? Какие расширения GNU C действительно необходимы для некоторых проектов и почему?

5 ответов


в этой статье объясняются используемые расширения:GCC хаки в ядре Linux. Некоторые из них тривиальны, некоторые нет (в основном приемы оптимизации).


вот несколько расширений gcc, которые использует ядро Linux:

  • ассемблерной
  • GCC builtins, такие как _ _ builtin _ expect,_ _ builtin _ constant,_ _ builtin _ return _ address
  • атрибуты функций, чтобы указать, например, какие регистры использовать (например, _ _ attribute__((regparm (0)),__attribute__((packed, aligned(PAGE_SIZE)))))
  • конкретный код в зависимости от предопределенных макросов gcc (например, обходные пути для определенных ошибок gcc в некоторых версии)
  • ряды в случаях переключателя (случае 8 ... 15:)

вот еще несколько: http://www.ibm.com/developerworks/linux/library/l-gcc-hacks/

большая часть этих особенностей gcc очень зависит от архитектуры или становится возможной из-за того, как реализуется gcc, и, вероятно, не имеет смысла указывать стандарт C. Другие-просто удобные расширения для C. поскольку ядро Linux построено, чтобы полагаться на эти расширения, другие компиляторы должны предоставлять те же расширения, что и gcc, чтобы иметь возможность создавать ядро.

Это не то, что Linux had полагаться на эти функции gcc, например, ядро NetBSD очень мало полагается на конкретные вещи gcc.


ядро Linux было написано для компиляции GCC, поэтому стандартное соответствие никогда не было целью для разработчиков ядра.

и если GCC предлагает некоторые полезные расширения, которые делают кодирование проще или скомпилированное ядро меньше или быстрее, было естественным выбором использовать эти расширения.


GCC поддерживает Вложенные Функции, которые не являются частью стандарта C99. Тем не менее, требуется некоторый анализ, чтобы увидеть, насколько они распространены в ядре linux.


Я думаю, это не они действительно что надо. Просто есть много полезных, и переносимость кросс-компилятора не так много проблем для ядра Linux, чтобы отказаться от Тонкостей. Не говоря уже о том, что потребуется много работы, чтобы избавиться от зависимости от расширений.