楼主:
kkroy (☆㊣↖煞气ㄟ阿喂↘ξ★)
2017-12-29 18:47:02请问各位大大,我定义一个 #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阶段就换判错。
请问有谁知道是怎回事吗?
感恩!~
手边没编译器 不过你可以用gcc -E选项展开macro看看
楼主:
kkroy (☆㊣↖煞气ㄟ阿喂↘ξ★)
2017-12-29 18:57:00可是 case 2 取址两次了不是吗?
作者:
LPH66 (-6.2598534e+18f)
2017-12-29 19:05:00位址一样型别不一样, 但你的 macro 版里用了指标转型把这个差别给盖掉了你有仔细看函式版的错误讯息就会知道 &obj.bitmap 的型别是int(*)[3], 即“指向一个长度为 3 的 int 阵列的指标”
楼主:
kkroy (☆㊣↖煞气ㄟ阿喂↘ξ★)
2017-12-29 23:34:00可是 case2,不是取第一个bitmap array位置的位置吗?应该是double pointer ,我的理解是 int** 的型态吧?
case 2传int阵列的位址,经过转型,就得到指向int的指标case 1是int阵列转型成int指标
楼主:
kkroy (☆㊣↖煞气ㄟ阿喂↘ξ★)
2017-12-30 08:42:00了解! 感谢两位L大的解答~