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

Spec-Zone.ru

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