Tag: 隐式声明

隐式函数声明和链接

最近我在C中学习了隐式函数声明。 主要观点很明确,但在这种情况下我对理解联系过程有些麻烦。 请考虑以下代码(文件ac ): #include int main() { double someValue = f(); printf(“%f\n”, someValue); return 0; } 如果我尝试编译它: gcc -c ac -std=c99 我看到关于函数f()隐式声明的警告。 如果我尝试编译和链接: gcc ac -std=c99 我有一个未定义的引用错误。 一切都很好。 然后我添加另一个文件(文件bc ): double f(double x) { return x; } 并调用下一个命令: gcc ac bc -std=c99 令人惊讶的是,一切都成功地联 当然在./a.out调用后我看到了垃圾输出。 所以,我的问题是:如何将隐式声明函数的程序链接起来? 在编译器/链接器的引擎下我的例子会发生什么? 我读了很多关于SO的话题, 这个和这个但仍然有问题。

为什么/ C允许隐式函数和无类型变量声明?

为什么语言允许隐式声明函数和无类型变量? 我知道C是旧的,但是允许省略声明并且默认为int() (或者在变量的情况下为int )对我来说似乎并不那么理智,即使在那时也是如此。 那么,为什么它最初被引入? 它真的有用吗? 它实际上(仍然)使用过吗? 注意:我意识到现代编译器会给你警告(取决于你传递它们的标志),你可以抑制这个function。 那不是问题! 例: int main() { static bar = 7; // defaults to “int bar” return foo(bar); // defaults to a “int foo()” } int foo(int i) { return i; }