c – 具有不同定义的内联函数的不可预测行为

c – 具有不同定义的内联函数的不可预测行为,第1张

概述我有以下源文件: //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 我有以下源文件:

//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 – 具有不同定义的内联函数的不可预测行为所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/langs/1221793.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2022-06-05
下一篇2022-06-05

发表评论

登录后才能评论

评论列表(0条)

    保存