作者kkroy (☆㊣↖煞气ㄟ阿喂↘ξ★)
看板C_and_CPP
标题[问题] #define function 传 array
时间Fri Dec 29 18:47:02 2017
请问各位大大,我定义一个 #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阶段就换判错。
请问有谁知道是怎回事吗?
感恩!~
--
※ 发信站: 批踢踢实业坊(ptt.cc), 来自: 59.120.24.158
※ 文章网址: https://webptt.com/cn.aspx?n=bbs/C_and_CPP/M.1514544425.A.978.html
※ 编辑: kkroy (59.120.24.158), 12/29/2017 18:53:48
1F:推 Killercat: 手边没编译器 不过你可以用gcc -E选项展开macro看看 12/29 18:53
2F:推 soso7885: 两个都是传array第一位元位址进去 12/29 18:54
※ 编辑: kkroy (59.120.24.158), 12/29/2017 18:56:05
3F:→ kkroy: 可是 case 2 取址两次了不是吗? 12/29 18:57
4F:推 LPH66: 位址一样型别不一样, 但你的 macro 版里用了指标转型 12/29 19:05
5F:→ LPH66: 把这个差别给盖掉了 12/29 19:05
6F:→ LPH66: 你有仔细看函式版的错误讯息就会知道 &obj.bitmap 的型别是 12/29 19:08
7F:→ LPH66: int(*)[3], 即「指向一个长度为 3 的 int 阵列的指标」 12/29 19:09
8F:→ kkroy: 可是 case2,不是取第一个bitmap array位置的位置吗? 12/29 23:34
9F:→ kkroy: 应该是double pointer ,我的理解是 int** 的型态吧? 12/29 23:34
10F:推 loveflames: case 2传int阵列的位址,经过转型,就得到指向int的 12/30 00:08
11F:→ loveflames: 指标 12/30 00:08
12F:→ loveflames: case 1是int阵列转型成int指标 12/30 00:09
13F:→ kkroy: 了解! 感谢两位L大的解答~ 12/30 08:42
14F:→ loveflames: 阵列可以退化成指标,说穿就是这个 12/30 09:25