Использование #define для включения файла в C ++ / g ++ - PullRequest
0 голосов
/ 16 мая 2019

Я не пытаюсь написать:

#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

1 Ответ

9 голосов
/ 16 мая 2019

[cpp.rescan] / 3 Результирующая полностью замененная макросом последовательность токена предварительной обработки не обрабатывается как директива предварительной обработки, даже если она похожа на одну ...

Я считаю, что ваш квест безнадежен.

...