Что означает начальное и конечное подчеркивание в идентификаторах ядра Linux? - PullRequest
6 голосов
/ 24 февраля 2012

Я продолжаю сталкиваться с небольшими соглашениями, такими как __KERNEL__.

Является ли __ в этом случае соглашением об именах, используемым разработчиками ядра, или это синтаксическая причина для именования макросов таким образом?

Есть много примеров этого в коде.

Например, некоторые функции и переменные начинаются с _ или даже __.

Есть ли конкретная причинадля этого?

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

Кроме того, я вижу множество пользовательских типов, таких как uid_t.Опять же, я предполагаю, что это соглашение об именах, говорящее читателю, что это определенный пользователем тип?

1 Ответ

4 голосов
/ 24 февраля 2012

Есть несколько случаев:

  • В общедоступных заголовках, т. Е. Что-либо, что libc будет принимать и ставить под /usr/include/linux, стандарты определяют, какие символы должны быть определены, а любые другие символы, специфичные для системы, должны начинаться с символа подчеркивания и заглавной буквы или двух символов подчеркивания. Именно поэтому __KERNEL__, в частности, потому что он используется в заголовках, которые включены как в ядро, так и в libc, а некоторые объявления отличаются.
  • Во внутреннем коде принято, что символ __something является рабочей лошадкой для something, за исключением некоторого управления, часто блокирующего. Это причина для таких вещей, как __d_lookup. Аналогичное соглашение для системных вызовов заключается в том, что sys_something является точкой входа в системный вызов, которая обрабатывает переключение контекста в ядро ​​и из ядра и вызывает do_something для выполнения фактической работы.
  • Суффикс _t является стандартной библиотечной конвенцией для typedefs. Например. size_t, ptrdiff_t, foff_t и тому подобное. Код ядра следует этому соглашению и для его внутренних типов.
...