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

C Warning : Function was used with no prototype before its definition

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

myFunct was used with no prototype before its definition.

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

这是我的代码(简化版):

void myFunct();

int main(void)
{
   myFunct();
}

void myFunct()
{
   // Whatever
}

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

将声明替换为:

void myFunct(void);

您的代码为函数 myFunct() 提供了前向声明,但该声明不是 原型 ,因为它没有声明(零)函数参数的类型(见下文)。您提供的声明将函数声明为 return nothing 并接受固定但未指定数量的参数,* 编译器不足以完全验证函数称呼。该函数的实际原型是这样的:

void myFunct(void);

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


详情:

C2011 6.2.1/2 说,

A function prototype is a declaration of a function that declares the types of its parameters.

C2011 6.7.6/1 区分用于 ANSI 声明样式(尤其是函数原型)的 "parameter type list" 和用于 K&R 样式声明的 "identifier list"。两者都不能为空,但(只能)后者可以完全省略,所以带有空括号的函数声明是 K&R 风格的声明,它不提供原型。


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