2013-10-10 47 views
1

是否有一種機制檢查標頭是否正確地執行了實現?標題與C++中的實現不同

//my_pi.cpp 
float my_pi(){ 
    return 3.14; 
} 


//my_pi.h 
int my_pi(); 


//main.cpp 
#include <iostream> 
#include "my_pi.h" 

int main() 
{ 
    float returned; 
    returned = my_pi(); 
    cout << returned; 
} 

此編譯沒有錯誤,但是它給出錯誤的結果。我剛剛開始學習C++,這看起來像是一種非常簡單的方法,用於製作在OOP概念發揮作用時很難追蹤的錯誤(具有大型原型的類)。

還是有東西我失蹤了,它是一件好事,能夠定義一個不同的標題,而且只需要小心?

+0

您是否已將警告級別設置爲最高? –

+1

@claptrap我不認爲這將有助於在這種情況下。編譯階段沒有錯。對於鏈接器,一切都很好:'main.cpp'試圖使用符號'_Z5my_piv'和'my_pi.cpp'來產生它。沒有返回式安全。 –

+0

@JonathonReinhart因此,對於更復雜的類原型,符號可能會不同,並且會出現編譯器錯誤? Off topic:你如何檢查生成的符號? – TheMeaningfulEngineer

回答

5

總是在實現它的源文件中包含頭文件。這並不包含所有錯誤,但其中大部分都是錯誤的。例如,它不會在函數的參數中檢測到錯誤(因爲允許多個名稱相同的函數僅在參數上有所不同),但在這種情況下,無論如何您都會收到鏈接器錯誤。

+0

+1偉大的建議。但也:因爲這是C++不會名稱被破壞,確保類型兼容性? (並在這裏引起鏈接錯誤) –

+0

@JonathonReinhart是的我認爲你是對的,雖然編譯器錯誤比鏈接器錯誤更好。 – john

+1

其實在g ++中,'int my_pi()'和'float my_pi()'產生相同的符號:'_Z5my_piv',它是[demangled](http://pear.warosu.org/c++filtjs/)到' my_pi()'。 –