以下代码可以正常编译:
#include <stdio.h>
#include <errno.h>
#include <string.h>
#include <stdlib.h>
extern int errno ;
int main ( void )
{
FILE *fp;
int errnum;
fp = fopen ("testFile.txt", "rb");
if ( fp == NULL )
{
errnum = errno;
fprintf( stderr, "Value of errno: %d\n", errno );
perror( "Error printed by perror" );
fprintf( stderr, "Error opening file: %s\n", strerror( errnum ) );
exit( 1 );
}
fclose ( fp );
}
但是我不能用它编译:
gcc-8 -Wall -Wextra -Werror -Wstrict-prototypes
我得到以下信息:
program.c:6:1: error: function declaration isn’t a prototype [-Werror=strict-prototypes]
extern int errno ;
^~~~~~
cc1: all warnings being treated as errors
如何避免/解决此问题?我需要这个编译器标志-Wstrict-prototypes
答案 0 :(得分:7)
extern int errno ;
是错误的。您只需删除此行。
这是怎么回事,其中包括<errno.h>
,它定义了一个名为errno
的宏。好吧,实际上...
不确定
errno
是否为 宏或通过外部链接声明的标识符。如果取消了宏定义 为了访问实际对象,或者程序定义了一个标识符,其名称为errno
,行为是不确定的。
(来自C99, 7.5个错误<errno.h>
。)
在您的情况下,errno
可能会扩展为(*__errno())
之类的东西,因此您的声明将变为
extern int (*__errno());
将__errno
声明为一个函数(带有未指定的参数列表),该函数返回指向int
的指针。