内联函数如何在C ++中工作?

时间:2013-12-22 14:04:29

标签: c++ inline

现在我有2个c ++源文件:test9.cpp test10.cpp,它们都有一个同名的内联函数。

test9.cpp:

1 #include <iostream>
2 using namespace std;
3 void test();
4 inline void f1()
5 {
6     cout << "inline f1 in test9.cpp" << endl;
7 }   
8 int main()
9 {
10     f1();
11     test();
12     return 0;
13 } 

test10.cpp:

1 #include <iostream>
2 using namespace std;
3 inline void f1()
4 {
5     cout << "inline f1 in test10.cpp" << endl;
6 }   
7 void test()
8 {
9     f1();
10 } 

现在用g ++编译它们:g ++ test9.cpp test10.cpp ./a.out我得到以下结果:

inline f1 in test9.cpp
inline f1 in test9.cpp

怎么了?我以为它会是:“test10.cpp中test9.cpp inline f1中的内联f1” 谁能告诉我为什么? g ++编译器如何处理内联函数?

1 个答案:

答案 0 :(得分:7)

虽然编译器允许您(不,要求你!)重新定义标记为inline的函数,但外部链接的默认值仍然适用,因此您违反了一个定义规则。这会导致未定义的行为和您看到的结果。

  

[C++11: 7.1.2/4]:内联函数应在每个使用过的翻译单元中定义,并且在每种情况下都应具有完全相同的定义(3.2)。 [..]