Я могу скомпилировать и запустить следующий код с gcc 4.4.7.Почему передача дополнительных аргументов функции C не приводит к ошибке времени компиляции?
Файл: MC
#include <stdio.h>
int main()
{
printf("%d\n", f(1, 2, 3));
}
Файл: FC
int f(int a, int b)
{
return a + b;
}
Выход:
$ gcc m.c f.c && ./a.out
$ 3
Когда функция f()
определяется в том же файле, компилятор выдает сообщение об ошибке, как ожидается. Я предполагаю, что компилятор не может обнаружить ошибочное использование функций между единицами компиляции. Но разве линкер не сможет его обнаружить? Указывает ли стандарт на ожидаемое поведение?
Обратите внимание: это отличается от объявления функции без каких-либо параметров, которая работает даже внутри одного файла. (Why does gcc allow arguments to be passed to a function defined to be with no arguments?).
Я использую GCC (GCC) 4.4.7 20120313 (Red Hat 4.4.7-11) и GNU л.д. версия 2.20.51.0.2-5.42.el6 20100205.
C не проверен на тип или не набирается такого типа :-( –
Для совместимости с программами на C, написанными до 1989 года. Однако код выше вызывает неопределенное поведение. "Если выражение, которое обозначает вызываемую функцию, имеет тип, который делает не включать прототип ... Если количество аргументов не равно числу параметров, поведение не определено ». –
Чтобы избежать этой проблемы, добавьте заголовок' fh' с прототипом 'int f (int a, int b); 'и' # include' этот заголовок в 'fc' и в любом исходном файле, который вызывает' f'. И вызывать gcc с аргументами, которые предупреждают о вызовах необъявленных функций, либо '-std = cXX' для кода который не нуждается в расширениях GNU или '-std = gnuXX' для кода, который делает (где' XX' - '99' или' 11'). –