我写了以下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);
导致了这个吗?怎么样?
答案 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);
}