Spec-Zone.ru › GCC 10 CPP

Следующая: Аргументы макроса, Предыдущая: Макросы типа объекта, Вверх: Макросы [Оглавление][Индекс]

3.2 Макросы, похожие на функции ¶

Вы также можете определять макросы, использование которых напоминает вызов функции. Эти макросы называются макросами, похожими на функции. Для определения макроса, похожего на функцию, используется та же директива ‘#define’, но после имени макроса ставится пара скобок. Например,

#define lang_init()  c_init()
lang_init()
     → c_init()

Макрос, похожий на функцию, будет расширен только если его имя появляется со следующей за ним парой скобок. Если вы напишете только имя, оно останется без изменений. Это может быть полезно, когда у вас есть функция и макрос с одинаковым именем, и вы хотите иногда использовать функцию.

extern void foo(void);
#define foo() /* optimized inline version */
…
  foo();
  funcptr = foo;

Здесь вызов foo() будет использовать макрос, но указатель на функцию получит адрес реальной функции. Если макрос был бы расширен, это привело бы к синтаксической ошибке.

Если вы поставите пробелы между именем макроса и скобками в определении макроса, это не определяет макрос, похожий на функцию, а определяет макрос типа объекта, чьё расширение случайно начинается с пары скобок.

#define lang_init ()    c_init()
lang_init()
     → () c_init()()

Первые две пары скобок в этом расширении взяты из макроса. Третья — это пара, которая изначально стояла после вызова макроса. Поскольку lang_init — макрос типа объекта, он не потребляет эти скобки.

© Free Software Foundation
Licensed under the GNU Free Documentation License, Version 1.3.
https://gcc.gnu.org/onlinedocs/gcc-10.5.0/cpp/Function-like-Macros.html

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API