老問題,但仍...
我用幾個簡單的幫手這一點。它會給出錯誤鏈接時那是相當可讀:
// 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
確保後者。 (所以:結合任何持續集成包,基本上都會失敗。)
顯然大多數人會不小心混淆了notimplemented
和notimplementedvirtual
。事實上,這不是一個大問題:一個簡單的解決方案就是始終使用前者,除非你想擺脫這個錯誤,因爲這是一個WIP。
如果一個函數是_not implemented_(如在,未聲明但未定義),那麼你將得到一個鏈接時間錯誤。在這種情況下,你的功能被實現,並且具有定義良好的行爲。 – Chad