Что происходит в определении с пустыми скобками? пример: #define FOO ()?

Проще говоря, в моем знании C ++ (или его отсутствии) FOO будет заменено тем, что находится в скобках, когда это было определено. Но что произойдет, если круглые скобки пусты? Это эквивалентно 0? Это означает #ifdef foo (0) будет делать то же самое, что и #ifdef foo ( )? Если эквивалент, какой-нибудь полезный эффект должен использоваться с пустыми скобками?

-1

Решение

Расширение макроса будет просто расширяться до того, что макрокоманда будет расширена до:

#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 в результате.

2

Другие решения

#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).

2

#define директива препроцессора и просто глупое правило замены текста, которое происходит до на самом деле компилирование вашего кода. При применении определений макросов модели кода пока нет.

#define FOO ()

заменяет каждое вхождение FOO с (),

#define FOO (0)

заменяет каждое вхождение FOO с (0),

#define FOO 0

заменяет каждое вхождение FOO с 0, который не такой же как (0) (в некоторых случаях это имеет значение).

Тем не мение,

#define FOO()

заменяет FOO() ни с чем, не трогает FOO

0
По вопросам рекламы ammmcru@yandex.ru
Adblock
detector