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

Spec-Zone.ru

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