即使函数接受参数也会警告函数原型
Warning about function prototype even when the function takes arguments
我在 C 中有一个简单的函数,它接受 int*
参数,我在 header 文件中有它的声明,如下所示:
void mapAuditFioError(int *errno);
但编译器 cirbs 编译包含此 header 的文件如下:
"warning: function declaration isn't a prototype"
还有:
"warning: passing argument 1 of 'mapAuditFioError' from incompatible pointer type"
即使我用整数指针本身调用它。
浏览此警告总是谈论这样的函数:int func()
实际上应该声明为 int func(void)
。但是我上面的函数有什么问题呢?
这是因为 errno
is a reserved name 在 C 中(独立实现除外),用于从标准库函数中传达错误条件。正如 glibc 文档所说:
The names of all library types, macros, variables and functions that
come from the ISO C standard are reserved unconditionally; your
program may not redefine these names. All other library names are
reserved if your program explicitly includes the header file that
defines or declares them.
您不能使用 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 特别指出
If a macro definition is suppressed in order to access an actual object, or a program
defines an identifier with the name
errno
, the behavior is undefined.
我在 C 中有一个简单的函数,它接受 int*
参数,我在 header 文件中有它的声明,如下所示:
void mapAuditFioError(int *errno);
但编译器 cirbs 编译包含此 header 的文件如下:
"warning: function declaration isn't a prototype"
还有:
"warning: passing argument 1 of 'mapAuditFioError' from incompatible pointer type"
即使我用整数指针本身调用它。
浏览此警告总是谈论这样的函数:int func()
实际上应该声明为 int func(void)
。但是我上面的函数有什么问题呢?
这是因为 errno
is a reserved name 在 C 中(独立实现除外),用于从标准库函数中传达错误条件。正如 glibc 文档所说:
The names of all library types, macros, variables and functions that come from the ISO C standard are reserved unconditionally; your program may not redefine these names. All other library names are reserved if your program explicitly includes the header file that defines or declares them.
您不能使用 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 特别指出
If a macro definition is suppressed in order to access an actual object, or a program defines an identifier with the name
errno
, the behavior is undefined.