Структура #define Macro

0

Я нашел эту загадочную конструкцию внутри include/linux/wait.h

 #define DEFINE_WAIT_FUNC(name, function)                                \
        wait_queue_t name = {                                            \
                 .private        = current,                              \
                 .func           = function,                             \
                 .task_list      = LIST_HEAD_INIT((name).task_list),     \
        }

Я хорошо знаю макросы и директивы preproc в целом, но я абсолютно потерял это. Может кто-нибудь, пожалуйста, объясните приведенную выше структуру кода подробно, включая "\" в конце строки. Благодарю.

Примечание. Мне не нужно знать, что он делает в linux, только синтаксический смысл.

Теги:
c-preprocessor

3 ответа

2

Символ \ в макросах является символом продолжения строки. Он просто позволяет макросу охватывать несколько строк.

  • 0
    Спасибо за ответ, ценю это. А как насчет отдыха? Для меня очень важно понять имя wait_queue_t = {.private = current, .....} внутри тела #define?
  • 2
    @AnupSaumithri Это не связано с макросами, но это синтаксис C99. Что означает точка (.) В инициализаторе структуры?
Показать ещё 1 комментарий
1

Как и другие (и многие ссылки он-лайн), символ \ продолжает любую строку через c-препроцессор. Что касается остальных,

#define DEFINE_WAIT_FUNC (имя, функция)\

Определение макроса.

   wait_queue_t name = {                                            \

Объявляет wait_queue_t с именем подстановки макроса.

            .private        = current,                              \

Инициализируйте private член wait_queue_t с помощью current указателя задачи. Это также макрос (возможно, встроенный ассемблер), определенный каждой архитектурой в дереве Linux.

            .func           = function,                             \

Установите член func в параметр функции.

            .task_list      = LIST_HEAD_INIT((name).task_list),     \

Инициализирует список как пустой. task_list указывает на себя.

. нотация используется через исходный код ядра и является функцией gcc (а позже и C99), называемой назначенными инициализаторами. Вместо того, чтобы устанавливать все элементы структуры, только именованные инициализируются, а остальные установлены на ноль. Это позволяет людям расширять структуру без изменения всех объявлений. Это не функция c-препроцессора, а язык C (расширение).

1

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

Ещё вопросы

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