Объявление функции не является прототипом
Следующий код компилируется нормально:
#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
,