老问题,但仍然...
我为此使用了几个简单的助手。它会给出一个相当可读的错误链接时间:
// 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)" (?notimplemented@NotImplHelper@@SAXXZ) referenced in function "[blahblahblah]"
请注意,“引用函数”在 MSVC++ 中。我还没有在其他编译器中测试过它。
至于未实现的虚函数调用,您唯一的选择就是抛出异常。在开发过程中没有在调试器中实现这些是可以的 - 但是,当事情变得严重时,这些可能会被您的程序调用,因此它们应该可用。Astatic_assert
确保后者。(所以:结合任何持续集成包,它基本上都会失败。)
显然大多数人会不小心混淆notimplemented
和notimplementedvirtual
。实际上这不是一个大问题:一个简单的解决方案是始终使用前者,除非您想摆脱错误,因为它是 WIP。