请问各位大大,我定义一个 #define function 如下:
#define func(tmp) do{ \
int* bitmap = (int*)tmp; \
for(int i=0; i<3; i++) bitmap[i]+=2; \
}while(0)
宣告一个 struct:
struct AAA{
int bitmap[3]={0,1,2};
};
这时候,我搞不懂如果我在 main 里 呼叫 func(),因为只是做程式码替换,
不做型别检查,所以以下两种呼叫,执行结果都正确,但是想不通为什么!?
Case1: 我认为正确的呼叫方式!
int main() {
AAA obj;
for(int i=0; i<3; i++)
cout<< obj.bitmap[i] <<endl;
cout <<endl;
func(obj.bitmap);
for(int i=0; i<3; i++)
cout<< obj.bitmap[i] <<endl;
cout <<endl;
}
执行结果:
0
1
2
2
3
4
没啥问题!~
Case2: 我认为错误的呼叫方式:
int main() {
AAA obj;
for(int i=0; i<3; i++)
cout<< obj.bitmap[i] <<endl;
cout <<endl;
// 再取址一次
func(&obj.bitmap);
for(int i=0; i<3; i++)
cout<< obj.bitmap[i] <<endl;
cout <<endl;
}
怎么结果还是:
0
1
2
2
3
4
没错耶!?????
结果显示跑出来的结果竟然都正确? 为什么?
把 #define 换回传统 function call / function return:
void func(int* tmp){
int* bitmap = (int*)tmp;
for(int i=0; i<3; i++) bitmap[i]+=2;
}
这样就符合期待了,只有 Case 1 能正确运作,Case 2 在compile阶段就换判错。
请问有谁知道是怎回事吗?
感恩!~