Каковы последствия наличия предупреждения «неявное объявление функции» в C? - PullRequest
3 голосов
/ 22 апреля 2010

Как говорится в вопросе, каково значение предупреждения «неявное объявление функции»? Мы только что установили флажки предупреждений на gcc и обнаружили немало случаев этих предупреждений, и мне интересно, какие проблемы это могло вызвать до их устранения?

Кроме того, почему это предупреждение, а не ошибка. Как gcc даже может успешно связать этот исполняемый файл? Как видно из приведенного ниже примера, исполняемые функции ожидаются.

Возьмите следующие два файла, например:

file1.c

#include <stdio.h>

int main(void)
{
   funcA();
   return 0;
}

file2.c

#include <stdio.h>

void funcA(void)
{
   puts("hello world");
}

Компиляция и вывод

$ gcc -Wall -Wextra -c file1.c file2.c
file1.c: In function 'main':
file1.c:3: warning: implicit declaration of function 'funcA'

$ gcc -Wall -Wextra file1.o file2.o -o test.exe
$ ./test.exe
hello world

1 Ответ

7 голосов
/ 22 апреля 2010

Если функция имеет определение, соответствующее неявному объявлению (т.е. она возвращает int и имеет фиксированное число аргументов, и не имеет прототипа), и вы всегда вызываете ее с правильным числом и типами аргументы, то нет никаких отрицательных последствий (кроме плохого, устаревшего стиля).

т.е. в вашем коде выше, это как если бы функция была объявлена ​​как:

int funcA();

Поскольку не не соответствует определению функции, вызов funcA() из file1.c вызывает неопределенное поведение, что означает, что он может завершиться сбоем. В вашей архитектуре, с вашим текущим компилятором, это явно не так, но архитектура и компиляторы меняются.

GCC может связать его, потому что символ, представляющий точку входа в функцию, не изменяется при изменении типа функции (опять же ... в вашей текущей архитектуре с вашим текущим компилятором - хотя это довольно распространено). *

Правильно объявлять ваши функции - это хорошо, если только по той причине, что это позволяет вам дать вашей функции прототип, а это означает, что компилятор должен диагностировать ее, если вы вызываете ее с неправильным числом или типами аргументов .

...