1

我经常遇到像这样的黑客

//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");
}

我想这是一个不好的做法,但除此之外:
有没有办法在编译期间做同样的事情,但前提是使用该函数(也就是如果它未使用,编译应该成功)。

编辑:我也对虚拟内存功能感兴趣。

4

4 回答 4

6

如果你完全删除实现并且只有函数声明,则会出现链接器错误,这基本上是编译时间。不幸的是,链接器错误往往很丑陋且难以追踪,但在调用尚未实现的函数的情况下,我认为它们非常易于管理。

于 2012-11-28T16:00:27.220 回答
5

如果它是非虚函数,那么您可以简单地注释掉定义。

如果它是在基类中声明的虚函数,那么您无法在编译时控制调用,那么您唯一的选择就是一些运行时错误或异常。

于 2012-11-28T16:01:18.723 回答
2

老问题,但仍然...

我为此使用了几个简单的助手。它会给出一个相当可读的错误链接时间:

// 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确保后者。(所以:结合任何持续集成包,它基本上都会失败。)

显然大多数人会不小心混淆notimplementednotimplementedvirtual。实际上这不是一个大问题:一个简单的解决方案是始终使用前者,除非您想摆脱错误,因为它是 WIP。

于 2017-07-05T14:36:02.243 回答
0

我能想到的最简单的解决方案是注释未实现的函数。

也许不是你想的那样,但是如果有任何东西试图使用它,这样做会产生一个编译时错误,并且生成的代码应该与一个通常被优化掉的空函数相同。

于 2012-11-28T16:03:51.337 回答