2014-05-23 48 views
0

我開發了幾個班的靜態庫,無意中發現了一個很奇怪:C++構造函數體的位置產生不穩定的結果

在我的頭我上課像這樣的:

class MyClass : public BaseClass { 
    int k; 
public: 
    MyClass(int a,int b) : BaseClass(a) { k=b; } 

    void func_1() { <whatever...> } 

    int func_2(); // <- this body is in the .cpp 
    ... 
}; 

當我編譯我的測試應用程序編譯並按預期工作。

爲了編譯測試應用程序,我創建了一組不同的頭文件(沒有任何代碼,只是方法/ ctor定義),並且我從中刪除了正文的每個方法或構造函數都得到了未解析的外部函數。我認爲,一旦庫被編譯,實際的代碼就在庫中,但是如果代碼是在頭中(也就是內聯),那麼沒有實際的代碼放入庫中。這是正常的嗎?

無論如何,我將庫的方法/ ctor主體從頭文件移動到cpp文件(少數頭文件中包含它們的主體),重新編譯了庫,然後使用與用於相同頭文件的測試應用程序編譯庫。 現在測試應用程序編譯正常,但產生不穩定的結果(很多方法返回隨機數)。

我削減&再次將.cpp代碼粘貼到.h,重新編譯庫,然後測試應用程序和測試應用程序正常工作。

我剪下&將.h中的代碼再次粘貼到.cpp中(只留下頭中的聲明),重新編譯庫,然後重新編譯測試應用程序,然後測試應用程序返回隨機結果。如果我編譯我的庫和測試應用程序與定義構造函數體的標題,everythign工作,如果相反構造函數體在.cpp,我得到錯誤/隨機結果。

我錯過了什麼嗎?如果一個方法或構造函數的代碼是在一個頭文件或一個cpp文件中定義的,那麼不應該真的不重要嗎?

+0

你是否正確初始化需要初始化的構造函數中的所有內容? – CoryKramer

+0

是的,他們真的只是非常基本的類,大多數ctors只是設置一個int – user815129

+0

你可以告訴我們你的cpp文件中產生隨機結果但內聯工作正常的函數之一嗎? – jasal

回答

0

是的,標題中內聯定義的方法通常不包含在生成的對象文件中。如果它們被調用並且實現決定它不願意或不能內聯它們,它們可能會被包括在內,但是你永遠不能依賴它。

當您想要動態調用方法時,即使用dlsym或類似的功能時,會發生同樣的問題。你不能得到一個方法指針指向一個內聯定義的方法。

+0

這閃耀一些光,謝謝 – user815129

相關問題