Spec-Zone.ru › GCC 9 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-9.5.0/cpp/Function-like-Macros.html

Spec-Zone.ru

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