传递包含特殊字符的预处理器标志 [c++17, g++]

Passing pre-processor flags that contain special characters [c++17, g++]

我正在尝试通过以下方式使用预处理器标志为 const char* 赋值。

#include <iostream>

#define ST(A...) #A
#define STR(A) ST(A)

const char* output = STR(FLAG);

int main() {
    std::cout << output;
}

这种方法效果很好,除非FLAG 包含一些特殊字符。当我尝试用

构建上面的内容时
g++ .\Main.cpp -std=c++17 -DFLAG="a,b!c)d}e-f"

我在错误日志中得到了这个。它不喜欢特殊字符。

<command-line>: error: expected ',' or ';' before 'd'
.\Main.cpp:4:19: note: in definition of macro 'STR'
    4 | #define STR(A) ST(A)
      |                   ^
.\Main.cpp:6:26: note: in expansion of macro 'FLAG'
    6 | const char* output = STR(FLAG);
      |                          ^~~~
<command-line>: error: expected declaration before '}' token
.\Main.cpp:4:19: note: in definition of macro 'STR'
    4 | #define STR(A) ST(A)
    6 | const char* output = STR(FLAG);
      |                          ^~~~
<command-line>: error: 'e' does not name a type
.\Main.cpp:4:19: note: in definition of macro 'STR'
    4 | #define STR(A) ST(A)
      |                   ^
.\Main.cpp:6:26: note: in expansion of macro 'FLAG'
    6 | const char* output = STR(FLAG);
      |  

程序的期望输出为 a,b!c)d}e-f

是否有任何(理智的)方法使用预处理器标志或类似的东西来获得此功能?

FLAG 是一个字符串时,您不必使用字符串化宏:

-std=c++17 -DFLAG="\"a,b!c)d}e-f\""

Live Demo