我可以在宏中使用相同的变量名称

时间:2017-09-13 00:58:52

标签: c variables macros

我写了如下代码。

测试宏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
}

1 个答案:

答案 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。