Я не пытаюсь написать:
#include MACRO(arg)
Вместо этого я пытаюсь написать просто:
MACRO(arg)
Многие люди говорят, что мы не можем написать такой макрос для #include anyфайл, но эта попытка завершается неудачей только на этапе предварительной обработки, ниже одного проходит препроцессор, но, как мне кажется, происходит сбой позже.
Я написал следующий тестовый код tmp1.cpp (который не компилируется):
#define HASH #
#define ZX(arg) HASH include <arg>
ZX(iostream)
int main()
{
}
А ниже приведен вывод некоторых команд:
$ g++ -E tmp1.cpp
# 1 "tmp1.cpp"
# 1 "<built-in>"
# 1 "<command-line>"
# 1 "/usr/include/stdc-predef.h" 1 3 4
# 1 "<command-line>" 2
# 1 "tmp1.cpp"
# include <iostream>
int main()
{
}
$ g++ -E tmp1.cpp > tmp2.cpp
$ g++ tmp2.cpp
$ ./a.out
$ g++ tmp1.cpp
tmp1.cpp:1:14: error: stray ‘#’ in program
#define HASH #
^
tmp1.cpp:2:17: note: in expansion of macro ‘HASH’
#define ZX(arg) HASH include <arg>
^
tmp1.cpp:4:1: note: in expansion of macro ‘ZX’
ZX(iostream)
^
tmp1.cpp:2:22: error: ‘include’ does not name a type
#define ZX(arg) HASH include <arg>
^
tmp1.cpp:4:1: note: in expansion of macro ‘ZX’
ZX(iostream)
^
$
Интересно, почему tmp2.cpp компилируется и выполняется успешно, а tmp1.cpp терпит неудачу на этапе компиляции?Разве это не то, что сначала запускается препроцессор, а затем его выходные данные передаются компилятору?tmp2.cpp - это только предварительно обработанная версия только tmp1.cpp.
[EDIT]
У меня было требование:
#ifdef SOMETHING
#define ZX(arg)
#else
#define HASH #
#define ZX(arg) HASH include <arg>
#endif