我写了如下代码。
测试宏1使用与其名称相同的变量(nCount
)。
测试宏2使用不同的命名变量。
我认为Macro 1的变量被认为是不同的变量,因为它用方括号括起来。
但是函数中变量的值是宏值的变化。 (您可以在tracelog结果中看到结果。)
另一方面,使用不同命名变量的宏2是可以的。
有人能解释为什么会发生这件事吗?
=====================Trace Log======================================
[MACRO_1] size = 5 / nCount = 5, (0x2b9d84)
[MACRO_2] size = 10 / nCount = 5, (0x2b9da4)
(我认为Macro 1中的大小值也是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
}
答案 0 :(得分:0)
以下是发生的事情:
宏1:
编译器扩展时
TEST_MACRO_1(nCount); // Macro 1
它用size
替换宏的替换列表中的nCount
的每个实例。这是结果(添加换行符并为了便于阅读而缩进):
int nCount = 10;
{
if(0 < nCount)
{
int nCount = 5;
printf("[MACRO_1] size = %d / nCount = %d, (0x%x)\n", (int)nCount, nCount, &nCount);
}
}
如您所见,内部nCount
遮蔽外部,代码打印5而不是10。
微距2:
同样,当编译器扩展时
TEST_MACRO_2(nCount); // Macro 2
size
再次被nCount
取代,结果变为:
int nCount = 10;
/* expansion of Macro 1 */
{
if(0 < nCount)
{
int nCount2 = 5;
printf("[MACRO_2] size = %d / nCount = %d, (0x%x)\n", (int)nCount, nCount2, &nCount2);
}
}
这里,内部变量是nCount2
,因此没有任何阴影,代码会打印外部nCount
,即10。