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

问题描述 投票:1回答:2

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

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

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

这是我的代码(简化):

void myFunct();

int main(void)
{
   myFunct();
}

void myFunct()
{
   // Whatever
}
c function prototype warnings
2个回答
11
投票

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

将声明替换为:

void myFunct(void);

4
投票

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

void myFunct(void);

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


细节:

C2011 6.2.1/2说,

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

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


* C ++与此不同。

© www.soinside.com 2019 - 2024. All rights reserved.