Действительно ли это код C (C99)?Является ли это сомнительным использование объявления не-прототипа функции?
int f();
int g(int x)
{
if (x<0) return f(x);
else return f(x,x);
}
Очевидно, что программа имеет неопределенное поведение, если g
когда-либо вызывается с отрицательным аргументом и f
не функция, которая принимает один int
аргумента, или если g
когда-либо вызывается с неотрицательным аргументом и f
является не функция, которая принимает два аргумента int
. Но иначе?
Рассмотрим в качестве примера этот отдельный исходный файл, который вызывает g
из вышеизложенного и обеспечивает f
:
int g();
#ifdef FOO
int f(int a, int b) { return a+b; }
int main() { return g(1); }
#else
int f(int a) { return a; }
int main() { return g(-1); }
#endif
Это даже не компилируется, верно? Не говоря уже о связи. –
@ Oli Charlesworth: Вы пробовали? Он компилирует и связывает меня. (Без ошибок или предупреждений с помощью 'gcc -std = c99 -Wall -Wextra -pedantic') –
@Oli: Возможно, вы сбиваете с толку C и C++? Конечно, нет никакого реального линкера, который дистанционно заботится о сигнатуре функции C во время связи. И если использование в моем вопросе действительно, что, я подозреваю, это так, то это доказательство того, что линкеру не разрешают заботиться о подписи. –