关于函数原型的警告,即使函数接受参数

时间:2015-03-15 12:34:59

标签: c compiler-warnings function-prototypes

我在C中有一个简单的函数,它接受int*参数,我在头文件中声明它,如下所示:

void mapAuditFioError(int *errno);

但编译器cirbs编译包括此标头的文件,如下所示:

"warning: function declaration isn't a prototype"

还有:

"warning: passing argument 1 of 'mapAuditFioError' from incompatible pointer type"

即使我用整数指针本身调用它。

浏览此警告时,始终会讨论如下函数:int func()实际上应该声明为int func(void)。但是我上面的函数有什么问题?

1 个答案:

答案 0 :(得分:4)

这是因为errno是C中的reserved name(除了独立实现),用于从标准库函数传递错误条件。正如glibc文档所说:

  

所有库类型,宏,变量和函数的名称   来自ISO C标准是无条件保留的; 您   程序可能不会重新定义这些名称。所有其他库名称   如果您的程序明确包含头文件,则保留   定义或声明它们。

您不能将errno用作变量名称。它可以被声明为宏,通常是。

例如我的Linux上的GCC和glibc,如果我在原型之前加上说<stdio.h>

void foo(int *errno);

被预处理成

void foo(int *(*__errno_location ()));

现在,编译时没有警告,因为它是一个合法的构造;在您的C编译器上errno表现不同。


要解决此问题,请将参数调用为其他内容,例如errcodeerror_number


<errno.h>上的C11标准N1570委员会草案7.5明确指出

  

如果为了访问实际对象或程序而禁止宏定义   使用名称定义标识符   errno行为未定义