c++ 用于展开C预处理器宏的不同扫描次数

i86rm4rw  于 2022-12-30  发布在  其他
关注(0)|答案(1)|浏览(147)

下面这样的问题是一个简单的宏,然而,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相同。

mqkwyuun

mqkwyuun1#

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

相关问题