看板 C_and_CPP 關於我們 聯絡資訊
開發平台(Platform): (Ex: VC++, GCC, Linux, ...) GCC 額外使用到的函數庫(Library Used): (Ex: OpenGL, ...) 問題(Question): void TestFunc(unsigned int TestVar) { return ; } int main() { int Var = 123; TestFunc(Var); return (0); } 在呼叫TestFunc的時候,我故意傳入了不同資料型態(int)的變數,卻可以正常的完成 編譯(0 error, 0 warning)。 餵入的資料(Input): 預期的正確結果(Expected Output): 錯誤結果(Wrong Output): 程式碼(Code):(請善用置底文網頁, 記得排版) 補充說明(Supplement): 一般來說如果在傳值的過程中資料型態錯誤,編譯器應該會提出error或是warning, 為什麼這段程式碼卻可以正常的完成編譯呢? -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 211.72.212.239
LPH66:隱式轉型 某些條件下編譯器會幫你做這件事 11/30 16:01
icetofux:謝謝你的關鍵字,忽然發現有這樣的機制在好危險。 11/30 16:39
diabloevagto:不知道能否關閉自動轉型? 11/30 17:16
diabloevagto:或是增加警告? 11/30 17:17
icetofux:我也還在找,這應該是在編譯器選項能找到。 11/30 17:38
LPH66:查到 gcc 有 -Wconversion 能找出可能造成值改變的隱式轉型 11/30 18:01
LPH66:不過像這種 signed/unsigned 可能需要加 -Wsign-conversion 11/30 18:01
icetofux:感謝,我記得以前看書的時候轉型只有很小的篇幅,沒想到 11/30 18:17
icetofux:會有重新認識它的一天XD 11/30 18:18
angleevil:~"~我覺得LPH66懂好多 11/30 19:34
x000032001:LP高手(咦? 11/30 20:17
xatier:樓上XDDDDDDD 隱式轉型陷阱很多 11/30 21:32
hilorrk:-Wall -Wextra -pedantic 常駐XD 11/30 23:51
xatier:樓上++ 12/01 00:12
LPH66:嘛, 我在高中三年已經被叫LP叫習慣了 = = 12/01 00:18
LPH66:我這個 ID 是在那位大人講出那個縮寫之前就取了的 (攤手) 12/01 00:19
tropical72:那.. 以後敬語從 L 大改 LP 大好了 (~逃 12/01 00:53
angleevil:~"~離題離太遠了 12/01 01:35
loveme00835:-Werror 如何? 最好用 12/01 04:34
angleevil:-Wall -Wextra -pedantic -Wconversion -Werror<-crazy 12/01 10:23
xatier:-Werror 很容易令人發瘋XD 12/01 13:54
angleevil:其實xatier搞錯一個重點,是開了所有檢查警告的參數 12/01 14:00
angleevil:再開-Werror才會發瘋. >.可是這樣做才能保持品質喔. 12/01 14:01
angleevil:雖然工程師會脾氣上升啦 12/01 14:01
xatier:同意 XD 但是這樣能逼自己寫出好 code! 12/01 16:54