有没有办法根据开关/标志有条件地包含标头或导入模块?

问题描述 投票:0回答:1

我已经尝试过:

#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 作为宏的定义/替换?

c++ macros
1个回答
0
投票

#
对于预处理器具有特殊含义。这是一个字符串化运算符。

[cpp.stringize]

15.6.3

#
运算符

  1. 类函数宏的替换列表中的每个
    #
    预处理标记应后跟一个参数,作为替换列表中的下一个预处理标记。

由于

include
不是类函数宏中的参数,因此替换失败。

您也不能添加采用

#include
作为值的参数:

[cpp.replace]

如果参数列表中存在预处理标记序列,否则这些预处理标记将充当预处理指令,则该行为是未定义的。

© www.soinside.com 2019 - 2024. All rights reserved.