
//test1.cpp#include <iostream>using namespace std;inline voID foo(){ cout << "test1's foo" << endl;}voID bar();int main(int argc,char *argv[]){ foo(); bar();} 和
//test2.cpp#include <iostream>using namespace std;inline voID foo(){ cout << "test2's foo" << endl;}voID bar(){ foo();} 输出:
test1's footest1's foo
咦???好的,所以我应该声明foos是静态的…但是这种事情不应该产生链接器错误,或者至少是警告?编译器如何从编译单元“看到”内联函数?
编辑:这是使用gcc 4.4.1.
解决方法 您正在运行 one-definition-rule.您没有看到任何错误,因为:[Some] violations,particularly those that span translation units,are not required to be diagnosed
在幕后发生的事情是编译器没有内联这些函数(除非使用优化器编译代码,否则许多编译器不会内联函数).由于函数是内联的并且可以出现在多个转换单元中,因此编译器会将该函数标记为link-once,它告诉链接器它不会将多个定义视为错误,而只是使用其中一个.
如果你真的希望它们不同,你需要一个静态函数.
总结以上是内存溢出为你收集整理的c – 具有不同定义的内联函数的不可预测行为全部内容,希望文章能够帮你解决c – 具有不同定义的内联函数的不可预测行为所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)