推 QQ29:原因是void *能指向任何東西嘛? 03/31 12:33
→ QQ29:可是我有個疑惑 我照你這樣寫 會出現警告 03/31 12:34
→ QQ29:warning C4312: '型別轉換' : 將 'int' 轉換為較大的'void * 03/31 12:34
→ QQ29:不是應該一樣size都是4嗎???? 03/31 12:34
推 yshihyu:應該是要 arg = (void *) &i; 才對 03/31 12:34
→ QQ29:照他這樣寫要用的時候 直接cast成 int就可以了 03/31 12:35
→ yshihyu:不會有警告~ 兩邊都是 void* 語法合法 03/31 12:35
推 QQ29:喔我是說他這種寫法 03/31 12:37
推 yshihyu:它應該要練習用 void* 03/31 12:38
推 QQ29:這樣寫也可以過 難道是void*無敵嗎? 為啥會有警告說大小不合 03/31 12:40
推 yshihyu:arg = (void *) i; 這語法沒錯~ 但用錯 把這樣是把 10 03/31 12:43
→ yshihyu:當作位址給 arg ... 10 這位址根本不合法 03/31 12:44
推 VictorTom:arg = (void*)&i 和 (void*)i 都合法, 只是結果不同.... 03/31 12:59
→ VictorTom:10這個位址不合法沒錯, 不過偶爾好像也會見到這種用cast 03/31 13:00
→ VictorTom:來做某寫特別的passing/處理的樣子@_@" 03/31 13:01
推 VictorTom:順便回2F, 用DevC++ 4.9.9.2測好像不會有warning.... 03/31 13:03
→ VictorTom:話說回來, 小轉大應該OK, 大轉小通常才可能有問題不是?? 03/31 13:04
推 yshihyu:這邊沒size 問題~ 這邊都是4byte 03/31 13:06
推 VictorTom:在32 bits環境應該是都OK; 不過小弟是說2F說的warning 03/31 13:08
→ VictorTom:假如真的不match, 小轉大應該也不會是什麼問題啊@_@" 03/31 13:09
推 QQ29:可是他們不是同樣大小嘛? 03/31 13:30
推 VictorTom:我這邊測出來是, 所以您的結果是挺奇怪的:) 03/31 13:34
→ VictorTom:剛刻意測一個char c=10; void *p=(void*)c; 03/31 13:35
→ VictorTom:這個例子DevCpp就會報warning: difference size了@_@" 03/31 13:35
→ VictorTom:所以Q大您真要查, 就sizeof()查一下兩個變數吧....XD 03/31 13:36
推 yshihyu:char c=10; void *p=(void*)c; // 這樣會出現警告是正常的 03/31 13:45
→ yshihyu:(void*)c; 又不是把 c 真的把 變成 4byte 03/31 13:46
推 yshihyu:void *p=(void*)&c; 改成這樣就OK 03/31 13:49
推 yshihyu:應該是說 指標型態轉型只可以用在 address , c 是整數型態 03/31 13:52
推 VictorTom:我懂y大您的意思, 不過我現在就是沒有要取address.... 03/31 13:55
→ VictorTom:現在就是純粹刻意要把一個數cast成address來用.... 03/31 13:56
推 yshihyu:對~ (void*) (int*) etc 指標這種轉換必須用在address 03/31 13:56
→ VictorTom:用char轉只是要做出Q大遇到的warning問一下size的問題. 03/31 13:56
→ yshihyu:&c 才是address of ... c 是整數 03/31 13:56
→ yshihyu:我印象中我以前在書上看過~ 不過我忘記在哪本書看過 03/31 13:57
→ VictorTom:所以char是刻意搞的特例; 但是int->void*這種case不是沒 03/31 13:57
→ VictorTom:有, 有可能design上int本來的值就是個address, 這樣做的 03/31 13:57
→ VictorTom:好壞先不論, 但是的確有這種int值存address的作法.... 03/31 13:58
→ yshihyu: void *p=(void*)(int)c; 你改這樣編譯你就知道 03/31 13:58
→ yshihyu:這樣阿~ 03/31 14:00
→ MOONRAKER:widening coercion理論上的確不該出warning 03/31 14:01
推 VictorTom:用VC2005試int i=10; void *p=(void*)i; 的個case.... 03/31 14:04
→ VictorTom:真的有 convert "int to void*" of greater size的warn 03/31 14:06
→ VictorTom:不過對int和void* sizeof都是4, 是小弟我英文不好嗎Orz 03/31 14:06
→ VictorTom:話說上面那段修正一下, 通常會用unsigned的而非signed:) 03/31 14:07
推 yshihyu:我覺得這邊譯器有差異~ 可能要查ANSI .. 03/31 14:11
推 VictorTom:補充, VC2005試char c=10; void *p=(void*)c; 的case. 03/31 14:11
→ VictorTom:竟然完全沒有warning, 我開始懷疑是MS自己在耍寶....Orz 03/31 14:12
→ VictorTom:照y大的加(void*)(int)c; DevCpp沒warn, VC2005有warn. 03/31 14:12
推 yshihyu:其實這種情況很多~ 滿多小地方ANSI 也沒定義~編譯器實作 03/31 14:13
→ yshihyu:上就有差異 03/31 14:13
→ VictorTom:就像y大說的, 看來compiler有差, 那留給強者查吧....XD 03/31 14:13
推 cplusplus:語意問題罷了 其實想怎麼寫都可以 知道自己在幹嘛就好 03/31 14:14
推 VictorTom:的確是語意問題, 只是有時候這種warning可能會造成 03/31 14:15
→ VictorTom:prefast build過不了吧? 如果是compiler問題就滿鳥的Orz 03/31 14:16
→ OpenBigJue:....上面是吵起來了嗎... 03/31 14:55
→ OpenBigJue:其實這只是存取特定記憶體位址的值罷了 嵌入式常用到 03/31 14:57
推 sunneo:沒有吵啊 只是討論熱烈 03/31 19:53
→ sunneo:MSVS你可以試試看,你用unsigned long long 轉void*反而沒有 03/31 19:54
→ sunneo:但事實上sizeof(void*)卻又是4 byte 所以有可能是....... 03/31 19:54
→ sunneo:可能是64位元可攜性警告吧,把它關掉看看 03/31 19:55
推 VictorTom:謝樓上:) 話說MSVS有些warn真的滿煩的, 還有一個常見的 03/31 21:52
→ VictorTom:就是str###()和str###_s(), 上次差點不小心把func換掉. 03/31 21:53
→ VictorTom:幸好主管提醒, 不然掛掉OS build的話小弟就要被定了Orz 03/31 21:54
→ VictorTom:掛掉其他OS的build, 漏字; 本來想用#define / #if來弄. 03/31 21:55
→ VictorTom:偏偏就是有地方用到要回傳char*的, 好像是strstr吧@_@" 03/31 21:56