Предупреждение о прототипе функции, даже если функция принимает аргументы
У меня есть простая функция в C, которая принимает аргумент int*
, и у меня есть объявление ее в заголовочном файле следующим образом:
void mapAuditFioError(int *errno);
Но компилятор cirbs компилирует файлы, включая этот заголовок следующим образом:
"warning: function declaration isn't a prototype"
А также:
"warning: passing argument 1 of 'mapAuditFioError' from incompatible pointer type"
Хотя я вызываю его с помощью самого целочисленного указателя.
Просмотр этого предупреждения всегда говорит о функциях, подобных этой: int func()
, которые на самом деле должны быть объявлены как int func(void)
. Но в чем проблема моей функции наверху?
1 ответ:
Это потому, что
errno
является зарезервированным именем В C (отдельно стоящие реализации), используемым для передачи ошибочных условий из стандартных библиотечных функций. Как сказано в документации glibc:Имена всех типов библиотек, макросов, переменных и функций, которые исходите из стандарта ISO C зарезервированы безоговорочно; ваш программа не может переопределять эти имена . Все остальные имена библиотек: зарезервировано, если ваша программа явно включает в себя файл заголовка, который определяет или объявляет их.
Нельзя использовать
errno
в качестве имени переменной. Он может быть объявлен как макрос, и часто это так.Например на GCC и glibc на моем Linux, если я включаю say
<stdio.h>
Перед прототипом,void foo(int *errno);
Предварительно обрабатывается в
void foo(int *(*__errno_location ()));
Теперь это компилируется без предупреждений, потому что это законная конструкция; на вашем компиляторе C
errno
ведет себя по-другому.
Чтобы исправить это, назовите свой параметр как-нибудь иначе, например
errcode
илиerror_number
.
В проекте 7.5 Комитета по стандарту С11 N1570 о
<errno.h>
конкретно говорится, чтоЕсли определение макроса подавляется для доступа к фактическому объекту или программе определяет идентификатор С именем
errno
, поведениене определено .