看板 C_and_CPP 關於我們 聯絡資訊
int f1(int i, char c); int f1(int i, char c) { return i+c; } int main(int argc, char *argv[]) { f1(5, 6); } 像這樣有 prototype 的函式, 傳入 6 的時候, 還是要做 integer promotion 嗎? 我從 gcc 產生的組合語言看到有做 integer promotion, 6 轉成 int, 到 f1 中在轉回 char, 但我查不到 spec 有說要這麼做 查到的資料要做 integer promotion 的是沒有 function prototype 以及用 k&R style 宣告。 這是 c11 spec 6.5.2.2 function call 查到的 If the expression that denotes the called function has a type that does include a prototype, the arguments are implicitly converted, as if by assignment, to the types of the corresponding parameters, taking the type of each parameter to be the unqualified version of its declared type. The ellipsis notation in a function prototype declarator causes argument type conversion to stop after the last declared parameter. The default argument promotions are performed on trailing arguments 看不是很懂, 是和 = 一樣的轉換方式嗎? 我在 "C 語言參考手冊" p158 看到有 prototype 不需要執行 integer promotion, 看來可能是 gcc 自己要這麼做的, 不是標準規定的。 而在 "C 編譯器剖析" p186, C編譯器為了 alignment 會把小於 int 的實際參數 轉成 int 在送進堆疊。 -- 紙上得來終覺淺,絕知此事要躬行。 -- ※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 49.217.153.168 ※ 文章網址: https://www.ptt.cc/bbs/C_and_CPP/M.1489668639.A.98F.html
pttworld: 加號就會轉了 03/16 20:54
AstralBrain: 這要看你用的ABI的規定, c不管這一塊 03/17 01:25
LPH66: 正確說來你最後一段講的那個為了對齊這回事是 ABI 在管的 03/17 01:33
LPH66: 它是屬於 calling convention 的一部份 03/17 01:38
https://www.facebook.com/groups/441041979282906/1291318880921874/?notif_t=like&notif_id=1489719686303486 https://www.zhihu.com/question/57207328 這是我在知乎上的發問, 綜合起來, 我的理解是這樣: 6 傳給參數 c, 可以看成 char c=6, 6 的 type 是 int (不是 short, 也不是 unsinged int), 所以會做 implicit conversion (所以若傳入 300, 就暴了), 而 function 的參數傳遞則是這裡說的 ABI。 由於這些巧合, 看起來就像 integer promotion ※ 編輯: descent (113.196.174.254), 03/17/2017 19:12:02