【发布时间】:2017-02-04 00:06:07
【问题描述】:
从关于 C 的 K&R Book 中,我收集到如果函数原型声明省略了参数(如在int foo(); 中),则类型和参数检查将被关闭,并且不会假设参数与旧版本的 C 兼容所以它不会破坏遗留代码。
但是下面的代码会抛出原型不匹配的编译错误:
#include <stdio.h>
void test();
int main(void) {
test(34.5f);
}
void test(float a) {
printf("%f\n", a);
}
错误:
C:\***.c:7:6: error: conflicting types for 'test'
void test(float a) {
^
有什么解释吗?
【问题讨论】:
-
gcc 添加:
note: an argument type that has a default promotion can't match an empty parameter name list declaration,所以void test(double a)有效,但void test(float a)无效。因此,“类型和参数检查已关闭,并且对参数没有任何假设”似乎过于简单化了。您应该参考 C 规范以了解该规则实际上是什么。 -
见stackoverflow.com/questions/1630631/… 这个问题可能被一些人认为是那个问题的重复并结束了。
-
编译器需要定义
void test(double a) {},因为test(34.5f);调用涉及默认参数提升,如果给定的声明不能用作原型,就会出现这种情况。其中一个促销活动是float ---> double。 -
@GrzegorzSzpetkowski 请注意,即使没有调用该函数,它仍然是一个错误
标签: c function function-prototypes