C警告:函数在定义之前没有使用原型

M.F*_*rru 1 c warnings prototype function

我在编译C项目时遇到警告:

myFunct在定义之前没有使用原型.

我不明白这个警告,因为原型确实在函数调用之前.

这是我的代码(简化):

void myFunct();

int main(void)
{
   myFunct();
}

void myFunct()
{
   // Whatever
}
Run Code Online (Sandbox Code Playgroud)

Grz*_*ski 12

在C中,void myFunct();是一个函数声明,它包含原型.这是一个过时的功能,可追溯到K&R(预标准)C,其中未检查函数调用和声明.

将声明替换为:

void myFunct(void);
Run Code Online (Sandbox Code Playgroud)

  • 是的,*警告:函数声明不是原型 [-Wstrict-prototypes]*。撤回了我的简历 (2认同)
  • 或 -Wmissing-prototypes (2认同)

Joh*_*ger 6

您的代码为 function 提供了前向声明myFunct(),但该声明不是原型,因为它没有声明(零)函数参数的类型(见下文)。您提供的声明声明函数不返回任何内容并接受固定但未指定数量的参数,*您将意识到这不足以让编译器完全验证函数调用。该函数的实际原型是这样的:

void myFunct(void);
Run Code Online (Sandbox Code Playgroud)

尽管如此,您的代码是完全有效的。仍然允许使用 K&R 样式的函数声明,并且它们满足 C 的声明前要求。他们只是不是很好的风格。


细节:

C2011 6.2.1/2说,

函数原型是声明其参数类型的函数声明。

C2011 6.7.6/1区分了在 ANSI 声明样式中使用的“参数类型列表”,特别是用于函数原型,以及在 K&R 样式声明中使用的“标识符列表”。两者都不能为空,但(仅)后者可以完全省略,因此带有空括号的函数声明是 K&R 风格的声明,它不提供原型。


* C++ 在这一点上与 C 不同。