我在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)
。但是我上面的函数有什么问题?
答案 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
表现不同。
要解决此问题,请将参数调用为其他内容,例如errcode
或error_number
。
<errno.h>
上的C11标准N1570委员会草案7.5明确指出
如果为了访问实际对象或程序而禁止宏定义 使用名称定义标识符
errno
,行为未定义。