Объявление функции не является прототипом

Следующий код компилируется нормально:

#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 ответ

Решение
extern int errno ;

неправильно. Вы должны просто удалить эту строку.

Что происходит, что вы в том числе <errno.h>, который определяет макрос с именем errno, А на самом деле...

Не указано, errno макрос или идентификатор, объявленный с внешней связью Если определение макроса подавлено для доступа к реальному объекту, или программа определяет идентификатор с именем errno, поведение не определено.

(Это из C99, 7,5 ошибок<errno.h>.)

В твоем случае errno вероятно расширяется до чего-то вроде (*__errno()), так что ваша декларация становится

extern int (*__errno());

который заявляет __errno как функция (с неопределенным списком параметров), возвращающая указатель на int,

Другие вопросы по тегам