作者descent (「雄辩是银,沉默是金」)
看板C_and_CPP
标题[问题]函式传进的参数需要做integer promotion吗
时间Thu Mar 16 20:50:31 2017
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://webptt.com/cn.aspx?n=bbs/C_and_CPP/M.1489668639.A.98F.html
1F:→ pttworld: 加号就会转了 03/16 20:54
2F:推 AstralBrain: 这要看你用的ABI的规定, c不管这一块 03/17 01:25
3F:推 LPH66: 正确说来你最後一段讲的那个为了对齐这回事是 ABI 在管的 03/17 01:33
4F:→ LPH66: 它是属於 calling convention 的一部份 03/17 01:38
https://www.facebook.com/groups/441041979282906/1291318880921874/?notif_t=like¬if_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