Подпись C func внутри ядра Linux: include / linux / sched.h

0

Снова найден один из тех определений тайных функций внутри ядра Linux. Сигнатура функции гласит:

static void __sched __schedule(void)

Теперь он имеет как void и __sched в качестве возвращаемого типа. Может кто-нибудь объяснить, что эти идентификаторы там делают. Разве это не должно быть void or __sched '? Как это может быть как?

Это определение __sched:

 #define __sched    __attribute__((__section__(".sched.text")))
  • 2
    И __attribute__ и __section__ описаны в документации gcc . Это что-то вроде «положи меня сюда». Кроме того, наиболее популярный поисковый запрос в Google по запросу "gcc __atttribute__ __section__" точно скажет, что именно вы спрашиваете.
  • 0
    Обязательно используйте extern "C" {} для объявления, если вы используете c ++ !
Показать ещё 1 комментарий
Теги:
function

1 ответ

5
Лучший ответ

void - это стандартный тип C, указывающий, что функция не возвращает результат.

__sched - это макрос, который расширяется в соответствии с указанным вами определением, делая объявление эквивалентным:

static void __attribute__((__section__(".sched.text"))) __schedule(void)

__attribute__ - это языковое расширение, поддерживаемое gcc (и компиляторами, совместимыми с gcc). Его значение зафиксировано в руководстве gcc. Он указывает, что сгенерированный код для функции должен быть помещен в указанный раздел в объектном файле.

Поскольку __sched или, вернее, последовательность, в которую он распространяется, не является именем типа, между ним и void нет конфликта.

(Двойные скобки в синтаксисе __attribute__ позволяют определить макрос как

#define __attribute__(arg)

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

  • 0
    Очень подробный ответ, спасибо. Но последние несколько строк, что вы имеете в виду, когда говорите «для использования, если вы хотите скомпилировать код с помощью компилятора, который не поддерживает это расширение, в результате чего его игнорируют, а не рассматривают как синтаксическую ошибку». расширения вы имеете в виду? ---Спасибо
  • 1
    __attribute__ - это расширение языка, поддерживаемое gcc, но не всеми другими компиляторами. Для компилятора, который его не поддерживает, __attribute__((...)) является синтаксической ошибкой. Я указывал на то, что синтаксис в двойных скобках позволяет обойти компиляцию кода, специфичного для gcc, с помощью компиляторов не-gcc. Это не особенно относится к вашему вопросу (ядро Linux не может быть скомпилировано с не-gcc-совместимым компилятором).

Ещё вопросы

Сообщество Overcoder
Наверх
Меню