我有以下C代码:
int main() {
myFunctionABC(2);
return 0;
}
void myFunctionABC(int n) {
printf("%d\n", n);
}
Run Code Online (Sandbox Code Playgroud)
所以...这段代码正在运行,我不明白为什么.我一直认为C编译器总是需要每个被引用的函数已经"已知",否则将无法编译过程.
这为什么有效?
在用C语言或C++调用函数之前,从未有过任何定义函数的要求(如问题标题所示).C++和C99(在某些情况下在C89/90中)需要在调用函数之前声明函数.
至于你的代码......你的代码不是"正常".你可以期待的最好的是你的代码会产生一些类似于"工作"的未定义行为.
首先,代码甚至不会编译为C++或C99(并且您将问题标记为C和C++).C++和C99无条件地要求在调用函数之前声明函数.
其次,使用C89/90编译器,代码可能会编译,但无论如何都会产生上述未定义的行为.即使在C89/90中调用可变参数函数(如printf)而不首先声明它们是非法的 - 它会产生未定义的行为.
对于非变量函数调用它们而不声明它们是正确的 - C89/90的隐式声明规则将负责这一点.但是这些规则将使编译器得出结论,你的未声明的myFunctionABC函数返回一个int,而实际上你将它定义为返回void- 这种差异也导致未定义的行为.大多数自尊的编译器至少会警告你这个问题.