【问题标题】:Can I use same variable name in macro [closed]我可以在宏中使用相同的变量名吗[关闭]
【发布时间】: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,它已经基本过时了(虽然代价是增加了构建时间,但这通常只是为了发布而已。

标签: c variables macros


【解决方案1】:

会发生什么:

宏 1:

当编译器展开时

TEST_MACRO_1(nCount);  // Macro 1

它将宏替换列表中size 的每个实例替换为nCount。这是结果(在添加换行符并缩进以提高可读性之后):

int nCount = 10;

/* expansion of Macro 1 */
{
    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 2 */
{
    if(0 < nCount)
    {
        int nCount2 = 5;
        printf("[MACRO_2] size = %d / nCount = %d, (0x%x)\n", (int)nCount, nCount2, &nCount2);
    }
}

这里,内部变量是nCount2,所以没有任何东西被遮蔽,代码打印外部nCount,即10。

【讨论】:

  • 感谢 Nisse 的建议。我根据您的建议编辑了代码,然后再次发布。不幸的是,结果还是一样。有什么我想不明白的吗?
  • 您当前的代码向printf() 传递的值过多。您以前的版本使用错误的格式说明符传递了指针("%p", (void)&amp;nCount 是一种可能的解决方案)。
  • @chanhongPark:我想通了并重写了我的答案。
  • 非常感谢。现在我清楚地明白了。谢谢!
猜你喜欢
  • 2018-04-03
  • 1970-01-01
  • 1970-01-01
  • 2019-02-14
  • 1970-01-01
  • 2016-09-04
  • 2021-08-23
  • 1970-01-01
  • 2017-11-01
相关资源
最近更新 更多