c 有 prototype 的函式, 實參還需要做 integer promotion 嗎?

“对于那些没有原型的函数,传递给函数的实参将进行缺省参数提升”是什么意思? 有人回答了, 那有 prototype 的函式呢? 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 有說要這麼…
关注者
4
被浏览
75

3 个回答

6.5.2.2 7

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.

直接转换到对应的类型。这不是整数提升,但是可能与整数提升的某一种情况完全相同(毕竟整数提升本身也是转换的一种)


另外,默认参数提升包括整数提升和将 float 提升到 double 两部分。


至于具体实现,这与 C 本身就没有关系了。

facebook.com/groups/441 &notif_id=1489719686303486 綜合起來, 我的理解是這樣: 6 傳給參數 c, 可以看成 char c=6, 6 的 type 是 int (不是 short, 也不是 unsinged int), 所以會做 implicit conversion (所以若傳入 300, 就暴了), 而 function 的參數傳遞則是 fb 連結說的 ABI。 由於這些巧合, 看起來就像 integer promotion