传递包含特殊字符的预处理器标志 [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\""
我正在尝试通过以下方式使用预处理器标志为 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\""