2010-05-31 60 views
3

我学到了----当默认的促销活动中踢:使用默认参数提升究竟何时预期的参数类型是未知的,这是当有说没有原型或者当争论是可变的。参数提升的要求

但是一个例子困惑我的是:

void func(char a, char b) 
{ 
    printf("a=%p,b=%p\n",&a,&b);  
} 

int main(void) 
{ 
    char a=0x11,b=0x22; 

    func(a,b); 

    return 0; 
} 

它在上面的例子中cleard:调用主FUNC时,就没有必要推进参数a和b,但输出显示&一= & b +4不是& a = & b + 1。如果没有促销发生,为什么两个CHAR参数之间有4个字节?

+0

您可以提供第一段的来源吗?它在哪里说呢? – 2010-05-31 11:51:48

+0

C专家编程----彼得林登 P207第8章 其中隐式类型转换发生在参数passing.Under K&R C,因为函数的参数是一个表达研究的另外的地方,类型提升发生在那里。在ANSI C中,如果使用原型,参数不会被提升;否则,他们是。扩大的参数被裁减到它们在被调用函数中声明的大小。 – HaoCheng 2010-05-31 12:08:21

回答

1

因为编译感觉就像在做这样的说法:-)

无法推断参数已经或尚未通过查看其地址刚刚晋升。 没有要求参数在堆栈上传递(或者甚至它们完全通过堆栈)。

编译器(和你的平台调用约定)可能指定堆栈始终保持对齐4个字节,但是这是一个具体的实施细节,而不是C语言标准的一部分。

+0

这意味着它在上面的例子中根本没有被提升? 你能告诉我,为什么一个lib功能,如 'ungetc函数' 声明如下:ungetc函数INT(INT C,FILE *流)为什么不ungetc函数字符(字符C,FILE *流)?而几乎每个FUNC倾向于使用INT而不是CHAR在他们的原型...... – HaoCheng 2010-05-31 12:20:13

+0

“ungetc函数”的返回值必须是INT,不CHAR,因为它需要能够返回EOF(这是该范围以外的值CHAR)。类似地,'ungetc'的参数是INT,因为允许传递EOF:“如果参数c字符的值等于EOF,则操作将失败并且流将保持不变。”不过,更普遍的是,我怀疑许多标准库函数采用INT的原因在于,它们可以追溯到K&R时期,因为升级到INT是规则。请参阅http://stackoverflow.com/questions/1255775/default-argument-promotions-in-c-function-calls – 2010-05-31 15:09:34