我已经尝试过:
#ifdef USE_CPP20_MODULES
#define IMPORT_OR_INCLUDE(module_name, include_filepath) \
import module_name;
#else
#define IMPORT_OR_INCLUDE(module_name, include_filepath) \
#include include_filepath
#endif
但是没有一个编译器编译它:
叮当:
Output of x86-64 clang 19.1.0 (Compiler #1)
<source>:6:2: error: '#' is not followed by a macro parameter
6 | #include include_filepath
| ^
海湾合作委员会:
<source>:5:56: error: '#' is not followed by a macro parameter
5 | #define IMPORT_OR_INCLUDE(module_name, include_filepath) \
我不明白为什么预处理器失败。我猜你不能使用 #include 作为宏的定义/替换?
#
对于预处理器具有特殊含义。这是一个字符串化运算符。
[cpp.stringize]
:
15.6.3
运算符#
- 类函数宏的替换列表中的每个
预处理标记应后跟一个参数,作为替换列表中的下一个预处理标记。#
由于
include
不是类函数宏中的参数,因此替换失败。
您也不能添加采用
#include
作为值的参数:
[cpp.replace]
:
如果参数列表中存在预处理标记序列,否则这些预处理标记将充当预处理指令,则该行为是未定义的。