3

以下代码编译良好:

#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

4

1 回答 1

7
extern int errno ;

是错的。您应该简单地删除此行。

发生的事情是您包含<errno.h>,它定义了一个名为errno. 实际上 ...

未指定errno是使用外部链接声明的宏还是标识符。如果为了访问实际对象而禁止宏定义,或者程序定义了名称为 的标识符 errno,则行为未定义。

(来自 C99, 7.5 Errors<errno.h>。)

在您的情况下errno可能会扩展为类似的内容(*__errno()),因此您的声明变为

extern int (*__errno());

它声明__errno为一个函数(带有未指定的参数列表),返回一个指向int.

于 2018-07-07T11:38:08.307 回答