prev up next   top/contents search

comp.lang.c FAQ 列表· 第 11.3 题

我的 ANSI 编译器看到以下代码时,抱怨存在不匹配:

	extern int func(float);

	int func(x)
	float x;
	{ ...


您混合使用了新式函数原型声明“extern int func(float);”和旧式函数定义“int func(x) float x;”。通常可以混合这两种样式(参见问题 11.4),但在这种情况下不行。

旧式 C(以及在没有原型的情况下,以及在变长参数列表中;参见问题 15.2)的 ANSI C 会在将某些参数传递给函数时“提升”它们。float会被提升为double,而字符和 short int 会被提升为int。(对于旧式函数定义,如果在被调用函数的体内按此声明,这些值会自动转换回相应的较窄类型。)因此,上面的旧式定义实际上表示func接受一个double(在函数内部会被转换为float)。

这个问题可以通过在定义中使用一致的新式语法来修复

	int func(float x) { ... }

或者将新式原型声明更改为与旧式定义匹配

	extern int func(double);
(在这种情况下,最清晰的做法是将旧式定义也更改为使用double[脚注]

可以说,完全避免使用“窄”(char, short int,而float)函数参数和返回值类型要安全得多。

另请参见问题 1.25

参考文献:K&R1 第 A7.1 节第 186 页
K&R2 第 A7.3.2 节第 202 页
ISO 第 6.3.2.2 节,第 6.5.4.3 节
Rationale 第 3.3.2.2 节,第 3.5.4.3 节
H&S 第 9.2 节第 265-7 页,第 9.4 节第 272-3 页


prev up next   contents search
关于此 FAQ 列表   关于 Eskimo   搜索   反馈   版权

Eskimo North 托管