【问题标题】:C++ compile-time un-implemented checkC++ 编译时未实现的检查
【发布时间】:2015-04-01 15:13:27
【问题描述】:

我们有几个 C++ 函数将在项目的第 2 阶段实现,它们是公共接口或其各自的类和模块的一部分。因为它们是公共接口的一部分,所以我们认为它们应该存在,至少在头文件中,在阶段 1 中,以便我们在实现其余类时仍然考虑它们。但是,由于它们未实现,我们不希望有人调用它们。我们希望在编译时进行此检查,以确保正确性。

我的愿望是:

  • 编译时间(可能是错误或警告;警告更好,因为它们更灵活 - 我们可以选择性地关闭它们)

  • 在 G++4.8.1 上工作并且不会终止 Visual Studio 2013 下的构建(我们仅将 Visual Studio/VisualAssistX 用作编辑器,但重构工具在没有构建的情况下无法工作)

  • 不难理解做了什么以及为什么

  • 函数存在于类文档中(我们可以包含一些 \warning not implemented in phase 1 符号以便 doxygen 获取)

我正在考虑三个选项:

  • marking them as deprecated 的腰带和吊带方法(将生成警告)并引发自定义异常 - 这几乎是我想要的,除了编译器警告它“已弃用”与实际情况相反: 不推荐使用的方法现在可以工作,但以后不会工作;此方法稍后会起作用,但现在不起作用

  • 另一个答案告诉how to forbid using a function while still having it exist - 这很好但不可读且难以搜索。另外,这是一个编译时错误——如果我们改变主意,我们不能让某些函数调用它——要么全有,要么全无。让每个未实现的函数成为模板让我想知道这个技巧是否总是有效。例如,虚函数不能是模板。

  • 只是将它们作为评论添加 - 阻止人们调用它们,但它们也不会出现在自动生成的文档中(我们以后无法决定是否进行选择性调用)

有没有更好的方法?如果没有,是否有理由更喜欢模板或注释选项而不是弃用选项?

【问题讨论】:

标签: c++ interface g++


【解决方案1】:

作为替代:

您可以在没有定义的情况下声明它们,因此会出现链接错误。
然后,您可以提供一个库not_yet_implemented,其定义为空,以允许过早使用这些函数。

将方法标记为已删除:= delete,最终将其包装在宏中

#define NOT_YET_IMPLEMENTED = delete

【讨论】:

  • 通过包含not_yet_implemented 库,它可以有效地使函数在任何地方都可以调用——取消对未实现的检查。我可以设想想要这样做的情况类似于int foo(){ do_stuff_needed_in_all_phases(); if(condition_only_true_in_phase2){ unimplemented_function(); } },这将使我们不必在第二阶段重新实现foo()。但是,我希望int bar(){ unimplemented_function(); } 仍然失败。
  • 由于上述原因,我更喜欢我的“弃用”解决方案。但是,这是唯一的答案,所以我会接受。感谢您抽出时间来解决其他人的问题并让互联网变得更美好。
猜你喜欢
  • 2011-01-06
  • 1970-01-01
  • 2011-02-06
  • 1970-01-01
  • 1970-01-01
  • 2019-01-19
  • 2021-10-06
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多