Подтвердить что ты не робот

Какая версия C используется в ядре Linux?

Использует ли ядро ​​Linux только старый синтаксис C90 или оптимизирован ли он с функциями C99/C11?

Мне было интересно, если по возможности использовать самые новые версии C.

4b9b3361

Ответ 1

В документе стиль кодирования ядра Linux ничего не говорится об использовании C90 и C99.

Он предлагает использовать typedefs для "новых типов, которые идентичны стандартным типам C99, в определенных исключительных обстоятельствах", в то время как в большинстве случаев не рекомендуется использовать typedefs. Обратите внимание, что это на самом деле не подразумевает зависимости от стандарта C99, поскольку такие определения типов могут быть определены в чистом C90.

Далее в обсуждении typedefs говорится:

В определенных структурах, которые видны пользователям, мы не можем требует типов C99 и не может использовать форму u32 выше. Таким образом, мы используем __u32 и аналогичные типы во всех структурах, которые совместно используются в пользовательском пространстве.

Подразумевается, что ядро должно работать с кодом пользователя, написанным на C90.

Единственная другая ссылка на C99:

Linux style for comments is the C89 "/*... */" style.
Don't use C99-style "//..." comments.

веб-страница документации ядра верхнего уровня именует стандарт C99 как "текущую версию языка программирования C" (которая, вероятно, была правильной, когда она была написана; текущая официальная версия теперь C11).

Глядя на исходники ядра, в дереве каталогов 1766 Makefile (по состоянию на последний раз, когда я проверял его из git). Из них только 3 относятся к опции -std=gnu99 gcc, и они предназначены для инструментов, а не для основного ядра (и еще 2 относятся к -std=gnu89, который в настоящее время используется по умолчанию). Это подразумевает, что подавляющее большинство исходных кодов ядра Linux написано для компиляции с параметрами, которые заставляют его (в основном) соответствовать стандарту C89/C90 с некоторыми расширениями, специфичными для GNU. Некоторые из этих расширений являются функциями C99.

Соглашения о кодировании для ядра Linux в основном контролируются Линусом Торвальдсом. Это сообщение от апреля 2012 г. показывает его личное отношение к (некоторым) особенностям C99:

On Wed, Apr 11, 2012 at 9:28 PM, Oleg Nesterov <[email protected]> wrote:
>
> Agreed. But,
>
>        error: 'for' loop initial declaration used outside C99 mode
>
> we should change CFLAGS, I guess. BTW, personally I'd like very much
> to use "for (type var; ...")" if this was allowed.

The sad part is that if we allow that, we also get that *other* insane
C99 variable thing - mixing variables and code.

I *like* getting warnings for confused people who start introducing
variables in the middle of blocks of code. That not well-contained
like the loop variable.

That said, most of the stuff in C99 are extensions that we used long
before C99, so I guess we might as well just add the stupid flag. And
discourage people from mixing declarations and code other ways (sparse
etc).

                         Linus

Ответ бандрами частично верен, поскольку указывает на то, что многие функции, добавленные C99, есть в библиотеке. По большей части библиотечные функции не имеют отношения к ядру Linux. Ядро не работает в "размещенной" среде и не имеет доступа к большей части стандартной библиотеки C; например, вы не можете использовать printf в ядре (там аналогичная функция printk используется для регистрации и отладки). Но это только часть картины. Многие функции, добавленные C99, написаны на собственном языке (то есть части, описанной в разделе 6 стандарта ISO C) и, по крайней мере, потенциально применимы к исходному коду ядра.

ОБНОВЛЕНИЕ:

RudolfW указывает на этот коммит, что делает конфигурацию -std=gnu89 (C 89/90 с расширениями GNU) явной.

Конечный результат: возможно, мы сможем перейти на более новую модель STDC в конце концов, но сейчас более новые модели имеют некоторые раздражающие недостатки, поэтому традиционная модель "gnu89" в конечном итоге является предпочтительный.

Это было в ответ на изменение в gcc5, которое, по-видимому, меняет стандарт по умолчанию на C11 (я не знаю, будет ли это -std=c11 или -std=gnu11, хотя я был бы немного удивлен, если бы не последний).

Ответ 3

На самом деле нет ответа, потому что ваш вопрос делает ошибочные предположения. Версии языка C предполагают существование платформы, но ядра ОС, такие как Linux , являются платформой (или, по крайней мере, ее большой частью), поэтому у них нет "версии" в этом смысле,

В терминах определения синтаксического анализа языка Linux написан на любом параллельном gcc/icc/etc. будет поддерживать, что на данный момент является C99. Но, как я уже сказал, различия между C90 и C99 основаны на ядре и библиотеке, поэтому на самом деле они не применяются к ядру. (Единственное исключение, о котором я могу думать, это анонимные функции, которые ядро ​​не использует.)

Большинство повседневных вещей, которые вы знаете о C, на самом деле находятся в библиотеке, которая зависит от ядра. Поэтому, когда вы программируете ядро, вы на самом деле имеете дело с другой настройкой, чем при написании обычной программы на языке C.