函数声明不是原型

时间:2018-07-07 11:23:02

标签: c errno gcc8

以下代码可以正常编译:

#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

1 个答案:

答案 0 :(得分:7)

extern int errno ;

是错误的。您只需删除此行。

这是怎么回事,其中包括<errno.h>,它定义了一个名为errno的宏。好吧,实际上...

  

不确定errno是否为   宏或通过外部链接声明的标识符。如果取消了宏定义   为了访问实际对象,或者程序定义了一个标识符,其名称为   errno,行为是不确定的。

(来自C99, 7.5个错误<errno.h> 。)

在您的情况下,errno可能会扩展为(*__errno())之类的东西,因此您的声明将变为

extern int (*__errno());

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