这个宏是如何工作的

Hows does this macro work?

本文关键字:工作 何工作      更新时间:2023-10-16

我写了以下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);导致这种情况吗?如何?

宏替换后,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);
}