我已經花了幾天時間在一個奇怪的問題,並最終發現有兩個inline
功能在項目中相同的簽名,他們造成了這個問題。爲了簡化這裏的情況就是一個例子:兩個CPP文件:如果重新定義內聯函數會怎樣?
a.cpp
#include <iostream>
void b();
inline void echo()
{
std::cout << 0 << std::endl;
}
int main()
{
echo();
b();
return 0;
}
和b.cpp
#include <iostream>
inline void echo()
{
std::cout << 1 << std::endl;
}
void b()
{
echo();
}
請注意:inline
功能echo
具有相同簽名但不同實現。編譯並運行
g++ a.cpp b.cpp -o a.out && ./a.out
或者這樣
g++ a.cpp -c
g++ b.cpp -c
g++ a.o b.o -o a.out
./a.out
它打印0 0
。 (我用的是G ++ 4.6.1是什麼,以及我鏗鏘++ 2.9,相同的結果測試)
如果開啓優化,像
g++ -O3 a.cpp b.cpp -o a.out && ./a.out
這是0 1
這個時候,就不會發生。
我的問題是,無論結果如何或編譯如何執行,都沒有錯誤甚至是警告我已多次定義了inline
函數。編譯器和鏈接器在這種情況下究竟發生了什麼?
編輯:
採取目標文件
nm a.o b.o | c++filt
兩個文件都記錄在echo()
看看符號。所以我認爲問題發生在鏈接時。難道說鏈接器會隨機選擇一個實現並丟棄所有其他實現嗎?
你有沒有試過更高級的警告(-Wall等)? – schnaader
我剛剛嘗試過'-Wall -Wextra',仍然沒有任何警告。 – neuront