2014-02-01 2 views
0

Снова найден один раз из тех тайных определений функций внутри ядра linux. Подпись функции выглядит следующим образом:C func signature in Linux Kernel: include/linux/sched.h

static void __sched __schedule(void) 

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

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

#define __sched   __attribute__((__section__(".sched.text"))) 
+2

Оба '__attribute__' и' __section__' покрываются документацией [gcc] (http://gcc.gnu.org/onlin edocs /). Его «поставил меня здесь». Кроме того, поисковый google для google для ["gcc \ _ \ _ atttribute \ _ \ _ \ _ \ _ section \ _ \ _"] (http://forum.kernelnewbies.org/read.php?14,822) расскажет вам в значительной степени * точно *, что вы просите. – WhozCraig

+0

Обязательно используйте 'extern 'C" {} 'для объявления, если вы используете [tag: C++]! –

+1

Вы пишете код C++, который работает в ядре? –

ответ

5

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

__sched макрос, который расширяется в соответствии с определением, вы цитируемом, делая декларацию, эквивалентную:

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

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

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

(двойные круглые скобки в синтаксисе __attribute__ позволяют Макроопределение как

#define __attribute__(arg) 

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

+0

Очень полный ответ, спасибо. Но последние несколько строк, что вы имеете в виду, когда говорите «для использования, если вы хотите скомпилировать код с компилятором, который не поддерживает это расширение, заставляя его игнорировать, а не рассматривать как синтаксическую ошибку». - Что на каких языках вы ссылаетесь? --- Спасибо – Ace

+1

'__attribute__' - это языковое расширение, поддерживаемое gcc, но не всеми другими компиляторами. Для компилятора, который его не поддерживает, '__attribute __ ((...))' является синтаксической ошибкой. Я указывал, что синтаксис с двойными скобками позволяет обходным путем для компиляции кода gcc с компиляторами, отличными от gcc. Это не имеет особого отношения к вашему вопросу (ядро Linux не может быть скомпилировано с компилятором, не совместимым с gcc). –