Я нашел эту загадочную конструкцию внутри 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-препроцессор. Что касается остальных,
#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 (расширение).
Макрос (предположительно) связывает структуру с указателем функции и выполняет обычную инициализацию. Допустим, вы хотите добавить эти структуры в список, а затем (во время шага выполнения) вызвать разные функции. Лучший вопрос, по крайней мере, включает определение wait_queue_t.