我在编译C项目时遇到警告:
myFunct在定义之前没有使用原型。
我不明白这个警告,因为原型确实在函数调用之前。
这是我的代码(简化):
void myFunct();
int main(void)
{
myFunct();
}
void myFunct()
{
// Whatever
}
答案 0 :(得分:11)
在C中,void myFunct();
是一个函数声明,不包含原型。这是一个过时的功能,可追溯到K& R(预标准)C,其中未检查函数调用和声明。
将声明替换为:
void myFunct(void);
答案 1 :(得分:4)
您的代码提供了函数myFunct()
的前向声明,但该声明不是原型,因为它没有声明(零)函数参数的类型(见下文)。您提供的声明声明函数不返回任何内容并接受固定但未指定数量的参数 * ,您将会发现这些参数不足以使编译器完全验证函数调用。该功能的实际原型是:
void myFunct(void);
您的代码完全有效。 K& R风格的函数声明仍然是允许的,它们满足C的声明要求。他们只是不好的风格。
<强>详细信息:强>
函数原型是声明其参数类型的函数的声明。
C2011 6.7.6/1区分在ANSI声明样式中使用的“参数类型列表”,特别是用于函数原型的“参数类型列表”,以及在K&amp; R样式声明中使用的“标识符列表”。两者都不能为空,但(仅)后者可以完全省略,因此带有空括号的函数声明是K&amp; R风格的声明,它不提供原型。
* C ++与此不同。