Проще говоря, в моем знании C ++ (или его отсутствии) FOO будет заменено тем, что находится в скобках, когда это было определено. Но что произойдет, если круглые скобки пусты? Это эквивалентно 0? Это означает #ifdef foo (0)
будет делать то же самое, что и #ifdef foo ( )
? Если эквивалент, какой-нибудь полезный эффект должен использоваться с пустыми скобками?
Расширение макроса будет просто расширяться до того, что макрокоманда будет расширена до:
#include <stdio.h>
#define L (
#define R )
#define l {
#define r }
#define LR ()
int main LR
l
printf L "Hello, World\n" R;
return 0;
r
будет прекрасно скомпилироваться (и если вы спрятаете макросы L / R / l / r в заголовочном файле, никто не поймет, что вы сделали. Обратите внимание, что пробелы нужны, по крайней мере, в некоторых местах, чтобы макрос действительно расширялся.
Это утверждение
#ifdef CRAPFOO ()
не будет компилироваться («дополнительные токены в конце #ifdef» в gcc, другие компиляторы могут выдавать другие ошибки.
#define CRAPFOO ()
#ifdef CRAPFOO
do something
#else
not something
#endif
дам do something
в результате.
#define
это абсолютно тупая текстовая замена. Так:
#define FOO ()
int main()
{
FOO;
}
становится
int main()
{
();
}
Вы можете проверить это с -E
возможность g++
(и я думаю clang
тоже), что означает «просто сделать предварительную обработку», или, что эквивалентно, просто запустить cpp
инструмент, который является препроцессором c.
то есть
$ echo -e "#define FOO ()\nint main()\n{\n FOO;\n}" > def.cpp ; g++ -E def.cpp
# 1 "def.cpp"# 1 "<command-line>"# 1 "def.cpp"
int main()
{
();
}
(Это инструменты командной строки Linux / Unix).
#define
директива препроцессора и просто глупое правило замены текста, которое происходит до на самом деле компилирование вашего кода. При применении определений макросов модели кода пока нет.
#define FOO ()
заменяет каждое вхождение FOO
с ()
,
#define FOO (0)
заменяет каждое вхождение FOO
с (0)
,
#define FOO 0
заменяет каждое вхождение FOO
с 0
, который не такой же как (0)
(в некоторых случаях это имеет значение).
Тем не мение,
#define FOO()
заменяет FOO()
ни с чем, не трогает FOO