返回信息流看下面这个程序:
#include <stdio.h>
void f(int a, long b, float c, double d) {
printf("a=%d b=%ld c=%f d=%lf\n", a, b, c, d);
}
typedef void (*sig2)(float c, double d, int a, long b);
typedef void (*sig3)(int a, float c, long b, double d);
typedef void (*sig4)(float c, int a, long b, double d);
int main() {
sig2 f2 = (sig2)f;
sig3 f3 = (sig3)f;
sig4 f4 = (sig4)f;
f ( 1, 2L, 3.0F, 4.0);
f2(3.0F, 4.0, 1, 2L);
f3( 1, 3.0f, 2L, 4.0);
f4(3.0f, 1, 2L, 4.0);
return 0;
}
结果:
a=1 b=2 c=3.000000 d=4.000000
a=1 b=2 c=3.000000 d=4.000000
a=1 b=2 c=3.000000 d=4.000000
a=1 b=2 c=3.000000 d=4.000000
好像参数的顺序并没有什么影响。而且我的机器挺好的,暂时还没有冒烟。
这是巧合吗?
p.s. 我用的是MacOSX系统,64位Intel处理器。
这是一条镜像帖。来源:北邮人论坛 / cpp / #88404同步于 2015/8/27
该镜像源已超过 30 天没有更新,可能在源站已被删除。
CPP机器人发帖
C语言也惊喜:我的机器怎么没有冒烟?
nuanyangyang
2015/8/27镜像同步47 回复
订阅后,新回复会通过你的通知中心匿名送达。
9 条回复
【 在 Lamperouge 的大作中提到: 】
: 自动转换类型么~(随口说的- -)
没有。类型没有被转换。不管用哪种顺序调用,形参a,b,c,d接收到的都分别是那个1, 2L, 3.0f, 4.0那4个实参,类型分别是int,long,float,double。
我在我电脑上运行的结果是:
a=1 b=2 c=3.000000 d=4.000000
a=1077936128 b=0 c=2.250000 d=0.000000
a=1 b=1077936128 c=0.000000 d=4.000000
a=1077936128 b=1 c=0.000000 d=4.000000
难道是编译器的原因,只能说不懂bd了[ema1]
ps:win7 64位intel处理器
【 在 nuanyangyang 的大作中提到: 】
:
: 没有。类型没有被转换。不管用哪种顺序调用,形参a,b,c,d接收到的都分别是那个1, 2L, 3.0f, 4.0那4个实参,类型分别是int,long,float,double。
【 在 Lamperouge 的大作中提到: 】
: 我在我电脑上运行的结果是:
: [code=c]
: a=1 b=2 c=3.000000 d=4.000000
: ...................
Calling convention的问题,windows不能重现这个行为。
来自「北邮人论坛手机版」
是
【 在 glazard 的大作中提到: 】
: 是ABI的关系吗,我记得x64通常会用很多寄存器传参数,是不是恰巧获得了符合预期的结果?
: 来自「北邮人论坛手机版」
来自「北邮人论坛手机版」