【发布时间】:2018-02-21 13:26:47
【问题描述】:
我写了如下代码。
测试宏 1 使用与它所调用的名称相同的变量 (nCount)。
并且测试宏 2 使用不同的命名变量。
我认为宏1的变量被认为是不同的,因为它是用方括号包装的。
但是函数中变量的值是改变为宏的值。 (你可以在tracelog结果中看到结果。)
另一方面,使用不同命名变量的宏 2 是可以的。
有人可以解释为什么会发生这种情况吗?
=====================Trace Log======================================
[MACRO_1] size = 5 / nCount = 5, (0x2b9d84)
[MACRO_2] size = 10 / nCount = 5, (0x2b9da4)
(我认为宏 1 中的 size 值也是 10,但它是 5)
源代码:
#include <stdlib.h>
#include <stdio.h>
#define TEST_MACRO_1(size) \
{ \
if(0 < size) \
{ \
int nCount = 5; \
printf("[MACRO_1] size = %d / nCount = %d, (0x%x)\n", (int)size, nCount, &nCount); \
} \
}
#define TEST_MACRO_2(size) \
{ \
if(0 < size) \
{ \
int nCount2 = 5; \
printf("[MACRO_2] size = %d / nCount = %d, (0x%x)\n", (int)size, nCount2, &nCount2); \
} \
}
int main()
{
int nCount = 10;
TEST_MACRO_1(nCount); // Macro 1
TEST_MACRO_2(nCount); // Macro 2
}
【问题讨论】:
-
两种不同语言的双重标记,高度不可读的代码,没有明确的解释,使用带有两个下划线的名称(保留用于实现)......你想完成什么?不要太喜欢宏,你最终会陷入宏地狱。你写了那个代码,所以你告诉它应该做什么,什么不工作。
-
C++ 为此类任务提供了理想的条件:内联函数(现代 C 也是)
-
谢谢@Olaf。对不起我的代码。我只是做了一个测试代码来解释。我将修复代码以使其更清晰。谢谢你的建议。
-
@JacekCz 感谢您的建议。我将使用内联而不是宏。但我想知道为什么会发生这种情况。我的知识越来越乱了。 :-)
-
@JacekCz:
inline函数只是一个提示;编译器可以随意忽略它。现代编译器将根据自己的判断和启发式内联,他们大多忽略inline。有了 LTO,它已经基本过时了(虽然代价是增加了构建时间,但这通常只是为了发布而已。