Снова найден один из тех определений тайных функций внутри ядра Linux. Сигнатура функции гласит:
static void __sched __schedule(void)
Теперь он имеет как void
и __sched
в качестве возвращаемого типа. Может кто-нибудь объяснить, что эти идентификаторы там делают. Разве это не должно быть void or
__sched '? Как это может быть как?
Это определение __sched
:
#define __sched __attribute__((__section__(".sched.text")))
void
- это стандартный тип C, указывающий, что функция не возвращает результат.
__sched
- это макрос, который расширяется в соответствии с указанным вами определением, делая объявление эквивалентным:
static void __attribute__((__section__(".sched.text"))) __schedule(void)
__attribute__
- это языковое расширение, поддерживаемое gcc (и компиляторами, совместимыми с gcc). Его значение зафиксировано в руководстве gcc. Он указывает, что сгенерированный код для функции должен быть помещен в указанный раздел в объектном файле.
Поскольку __sched
или, вернее, последовательность, в которую он распространяется, не является именем типа, между ним и void
нет конфликта.
(Двойные скобки в синтаксисе __attribute__
позволяют определить макрос как
#define __attribute__(arg)
для использования, если вы хотите скомпилировать код с компилятором, который не поддерживает это расширение, в результате чего его игнорируют, а не обрабатывают как синтаксическую ошибку. Некоторые атрибуты принимают несколько аргументов; обертывание всего списка аргументов в дополнительном наборе круглых скобок позволяет обрабатывать весь список, насколько это предпроцессор, как один аргумент.)
__attribute__
- это расширение языка, поддерживаемое gcc, но не всеми другими компиляторами. Для компилятора, который его не поддерживает, __attribute__((...))
является синтаксической ошибкой. Я указывал на то, что синтаксис в двойных скобках позволяет обойти компиляцию кода, специфичного для gcc, с помощью компиляторов не-gcc. Это не особенно относится к вашему вопросу (ядро Linux не может быть скомпилировано с не-gcc-совместимым компилятором).
__attribute__
и__section__
описаны в документации gcc . Это что-то вроде «положи меня сюда». Кроме того, наиболее популярный поисковый запрос в Google по запросу "gcc __atttribute__ __section__" точно скажет, что именно вы спрашиваете.extern "C" {}
для объявления, если вы используете c ++ !