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 的声明前要求。他们只是风格不好。
详情:
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 不同。
我在编译 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 的声明前要求。他们只是风格不好。
详情:
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 不同。