现在我有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 ++编译器如何处理内联函数?
答案 0 :(得分:7)
虽然编译器允许您(不,要求你!)重新定义标记为inline
的函数,但外部链接的默认值仍然适用,因此您违反了一个定义规则。这会导致未定义的行为和您看到的结果。
[C++11: 7.1.2/4]:
内联函数应在每个使用过的翻译单元中定义,并且在每种情况下都应具有完全相同的定义(3.2)。 [..]