[英]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.