怎么做这个宏观工作?

时间:2013-09-18 06:45:58

标签: c++ c compiler-errors

我写了以下C代码:

#define MAX_T(a,b,d) \
    { int len = (d);printf("len %d", len);}

int main()
{
    //MAX_T(10,30, smgarbage)
    MAX_T(10,30, len)
}

当我发表评论MAX_T(10,30, smgarbage)并运行它时,会输出 len 24 。当我注释掉MAX_T(10,30, len)并运行MAX_T(10,30, smgarbage)时,我收到此编译错误:

test.c: In function 'main':  
test.c:34: error: 'smgarbage' undeclared (first use in this function)  
test.c:34: error: (Each undeclared identifier is reported only once  
test.c:34: error: for each function it appears in.)

执行MAX_T(10,30, len)时为什么没有编译错误? 声明int len = (d);导致了这个吗?怎么样?

1 个答案:

答案 0 :(得分:6)

宏替换后,MAX_T(10,30, smgarbage)将为:

{ int len = (smgarbage);printf("len %d", len);}

显然没有smgarbage的延期。

MAX_T(10,30, len)将是:

{ int len = (len);printf("len %d", len);}

虽然输出未知,但这将编译,因为len包含垃圾值。

它与:

相同
{
    int len;
    len = len;
    printf("len %d", len);
}