2012-11-28 83 views
0

我經常遇到黑客喜歡有沒有辦法阻止在編譯期間使用未實現的函數?

//lets say this is some class that still doesnt support... 
//...all the functionality that it should based on the design docs 
void MyClass::MyFunction() 
{ 
    throw std::exception("not implemented"); 
} 

我想這是一個不好的做法,但旁白:
有沒有辦法做到在編譯期間同樣的事情,但前提是功能時(又名如果這是未使用的編譯應該成功)。

編輯:我也對虛擬內存功能感興趣。

+0

如果一個函數是_not implemented_(如在,未聲明但未定義),那麼你將得到一個鏈接時間錯誤。在這種情況下,你的功能被實現,並且具有定義良好的行爲。 – Chad

回答

4

如果它是非虛函數,那麼你可以簡單地註釋掉這個定義。

如果是在一個基類中聲明的虛函數,那麼你就無法控制在編譯時調用,這樣的話你唯一的選擇是一些運行時錯誤或異常。

+0

是的例子我看到的是虛擬成員funcs。 :) – NoSenseEtAl

6

如果除去實現完全和只有函數聲明,就會出現鏈接錯誤,這是基本的編譯時間。不幸的是,鏈接器錯誤往往是醜陋而難以追查的,但在調用尚未實現的函數的情況下,我認爲它們非常易於管理。

+2

鏈接器錯誤不是基本*編譯時。這是鏈接時間。 – Nawaz

+1

如果函數是虛擬的並且某個基類實現了該怎麼辦? –

0

我能想到的最簡單的解決方案是評論未實現的函數。

也許不是你腦子裏的東西,但這樣做,如果任何試圖使用它會產生一個編譯時錯誤,並將得到的代碼應該是相同的一個空函數,這通常是優化掉。

1

老問題,但仍...

我用幾個簡單的幫手這一點。它會給出錯誤鏈接時那是相當可讀:

// Not implemented is not implemented :-)thing, it'll break: 
struct NotImplHelper { static void notimplemented(); }; 
#define notimplemented() NotImplHelper::notimplemented(); 
#if defined(DEBUG) || defined(_DEBUG) 
#define notimplementedvirtual() throw std::exception(); 
#else 
#define notimplementedvirtual() static_assert(false, "You should implement virtual function calls before moving to production."); 
#endif 

用法:

//lets say this is some class that still doesnt support... 
//...all the functionality that it should based on the design docs 
void MyClass::MyFunction() 
{ 
    notimplemented(); 
    // or notimplementedvirtual() if MyFunction() is virtual... 
} 

理由:

恕我直言,如果你在程序中使用的功能,它應該是可用。當你嘗試編譯你還沒有實現的東西時,它應該給出編譯時或鏈接時錯誤。

F.ex.,在MSVC++這樣就給:

1>Test.obj : error LNK2019: unresolved external symbol "public: static void __cdecl NotImplHelper::notimplemented(void)" ([email protected]@@SAXXZ) referenced in function "[blahblahblah]" 

注意, '引用的函數' 是有在MSVC++。我沒有在其他編譯器中測試過它。

至於未實現的虛函數調用,你有它的唯一選擇拋出異常。在開發過程中沒有在調試器中實現這些功能是很好的 - 但是,當問題變得嚴重時,這些可能會被程序調用,所以它們應該可用。 A static_assert確保後者。 (所以:結合任何持續集成包,基本上都會失敗。)

顯然大多數人會不小心混淆了notimplementednotimplementedvirtual。事實上,這不是一個大問題:一個簡單的解決方案就是始終使用前者,除非你想擺脫這個錯誤,因爲這是一個WIP。

相關問題