小编Ser*_*kov的帖子

gcc和Microsoft预处理器之间的区别

我发现Microsoft Visual Studio编译器和gcc以不同的方式预处理以下小片段:

# define M3(x, y, z) x + y + z
# define M2(x, y) M3(x, y)
# define P(x, y) {x, y}
# define M(x, y) M2(x, P(x, y))
M(a, b)
Run Code Online (Sandbox Code Playgroud)

'gcc -E'给出以下内容:

a + {a + b}
Run Code Online (Sandbox Code Playgroud)

,'cl/E'发出关于缺少宏参数的警告并产生以下输出:

a + {a, b} +
Run Code Online (Sandbox Code Playgroud)

似乎来自嵌套宏扩展的逗号不被视为参数分隔符.不幸的是,我没有找到cl预处理器中实现的算法的描述,所以我不确定我的建议是否正确.有谁知道cl预处理器是如何工作的,它的算法和gcc之间有什么区别?以及如何解释观察到的行为?

c gcc visual-studio c-preprocessor

17
推荐指数
2
解决办法
2013
查看次数

gcc和MS预处理器之间的另一个区别

gcc预处理器和MS VS cl之间的另一个区别.请考虑以下代码段:

# define A(x) L ## x
# define B A("b")
# define C(x) x
C(A("a" B))
Run Code Online (Sandbox Code Playgroud)

对于'gcc -E',我们得到以下内容:

L"a" A("b")
Run Code Online (Sandbox Code Playgroud)

对于'cl/E',输出是不同的:

L"a" L"b"
Run Code Online (Sandbox Code Playgroud)

MS预处理器以某种方式执行额外的宏扩展.它的工作算法明显不同于gcc,但这个算法似乎也是一个秘密.有谁知道如何解释观察到的差异以及MS cl中的预处理方案是什么?

gcc visual-studio c-preprocessor

9
推荐指数
1
解决办法
476
查看次数

标签 统计

c-preprocessor ×2

gcc ×2

visual-studio ×2

c ×1