C++ 这个宏是如何工作的?

C++ 这个宏是如何工作的?,c++,c,compiler-errors,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_T10,30,smgarbage并运行它时,它输出len24。当我注释掉MAX_T10,30,len并运行MAX_T10,30时,我得到以下编译器错误: test.c: In functi

我编写了以下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_T10,30,smgarbage并运行它时,它输出len24。当我注释掉MAX_T10,30,len并运行MAX_T10,30时,我得到以下编译器错误:

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_T10,30时,len为什么编译器错误不会出现? Is语句int len=d;这是什么原因?如何进行?

宏替换后,最大值为10,30,smgarbage将为:

显然没有垃圾的去除

最大值为10,30,长度为:

尽管输出未知,但这将编译,因为len包含垃圾值

这与:

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

但是为什么它会编译呢?因为它不是语法错误如果你问预处理器gcc-E,cpp,MSVC保持预处理源代码等,它会告诉你:
{ int len = (len);printf("len %d", len);}
{
    int len;
    len = len;
    printf("len %d", len);
}