【发布时间】:2022-09-24 19:46:17
【问题描述】:
在以下示例中,MSVC 和 GCC 的输出不同。有人可以指出我正确的方向以了解原因吗?
#define TO_STRING(...) #__VA_ARGS__
#define QUOTE(...) TO_STRING(__VA_ARGS__)
#define KEY1 "Key1"
#define KEY2 "Key2"
#define KEY3 "Key3"
#define LEN1 32
#define LEN2 32
const char * cNVKeysMetaData = QUOTE(
{
"Area1":[
{
"key":KEY1,
"maxLength":LEN1,
"type":"s",
"default":"Hello"
},
#if defined(TEST)
{
"key":KEY2,
"maxLength":LEN2,
"type":"s",
"default":"invalid"
},
#endif
{
"key":KEY3,
"maxLength":64,
"type":"s",
"default":"invalid"
}
]
}
);
#include <iostream>
int main()
{
std::cout << cNVKeysMetaData << std::endl;
return 0;
}
海合会输出:
{ "Area1":[ { "key":"Key1", "maxLength":32, "type":"s", "default":"Hello" }, { "key":"Key3", "maxLength":64, "type":"s", "default":"invalid" } ] }
MSVC 输出:
{ "Area1":[ { "key":"Key1", "maxLength":32, "type":"s", "default":"Hello" }, #if defined(TEST) { "key":"Key2", "maxLength":32, "type":"s", "default":"invalid" }, #endif { "key":"Key3", "maxLength":64, "type":"s", "default":"invalid" } ] }
请注意,MSVC 确实替换了宏 KEY1 等,但没有去掉#if。 GCC 确实去掉了#if。
【问题讨论】:
-
@Peter,这是一个完全可重现的例子!将其直接粘贴到 godbolt.org 并选择最新的 GCC 或 MSVC 编译器。包括所有宏定义。
-
@Peter我不确定你的意思。这是一个mre godbolt.org/z/a6hYPh9ax
-
谢谢@cigien。只是在上面的示例中向其他人说明 /E 标志会阻止编译,因此需要将其删除以查看编译后的输出。
-
我认为现在所有的 C++ 爱好者都会在这之上!
标签: c++ c-preprocessor