Spec-Zone.ru › GCC 13 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-13.3.0/cpp/Function_002dlike-Macros.html

Spec-Zone.ru

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