Предупреждение о прототипе функции, даже если функция принимает аргументы


У меня есть простая функция в 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 2

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, поведениене определено .