繁体   English   中英

不同的扫描次数展开C预处理器宏

[英]A different number of scans to expand the C preprocessor macro

下面这样一道题是一个简单的宏,但是msvc和gnu/clang的编译行为是不一样的,所以在msvc中展开宏A,比gnu/clang需要多扫描1次,为什么会这样呢?

#include <stdio.h>

#define EMPTY()
#define DEFER_(X) X EMPTY()
#define DEFER1(...) __VA_ARGS__ DEFER_(EMPTY)()
#define DEFER(...) __VA_ARGS__ DEFER_(EMPTY)()
#define TO_STR(X) TO_STR_(X)
#define TO_STR_(X) #X
#define A() 123
#define EXPAND(...) __VA_ARGS__
#define EXPAND1(...) EXPAND(__VA_ARGS__)
#define EXPAND2(...) EXPAND1(__VA_ARGS__)
int main(void)
{
 printf(TO_STR(EXPAND1(DEFER(A)()))"\n");
}

除了 msvc 之外,godbolt 上所有编译器的行为都与 gnu 相同。

默认情况下,MSVC 不使用标准的 C 或 C++ 规则进行预处理。 使用开关/Zc:preprocessor 请求符合标准的预处理 您还可以使用/std:c17来请求符合 C 标准,而不仅仅是在预处理中,尽管符合性可能不完整。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM