只能由其他开发人员函数调用的C ++ Developer函数

时间:2016-08-18 13:03:46

标签: c++ c++17

我们有许多功能对开发和测试非常有用,但不应该是任何高效代码的一部分 - 主要是出于性能原因。我们的目标是让编译器确保标记为DEV_ONLY的函数只能由具有相同标记的函数调用。

我将如何实现以下内容:

virtual int foo() DEV_ONLY;

int bar() {
  foo(); // fails
}

int blah() DEV_ONLY {
  foo(); // works
}

DEV_ONLY是一个宏还是别的什么?

到目前为止,已经提出了以下想法,但并不完全是我想要的:

  • volatile:我发现的一个选项是将它们标记为“易变”(see Dr. Dobbs),但我有两个问题。首先,它会滥用具有不同语义的说明符,从而可能在将来引发问题。其次,关于函数“volatile”的编译器警告不会有帮助。

  • 朋友:根据我的理解,这需要在实现这种方法的类中声明友谊。由于使用该方法的测试或开发工具事先不知道,我不是朋友解决方案的朋友。

  • 不导出:可能使用或不使用该方法的代码甚至可能属于同一类。

  • 在发布版本中使用noop替换:测试可能仍然需要在发布模式下使用这些方法。

2 个答案:

答案 0 :(得分:1)

#ifdef预处理程序指令应该是实现两个目标的最直接的方法:

  • 不属于任何生产代码
  • 确保只能从具有相同"标记"的函数中调用它们。 (如果它们不存在,则DEV_ONLY未定义的构建将无法编译)

这意味着包装函数体以及相应的调用。

关于发布版本中应该可用的测试方法:那么它们不是DEV_ONLY,不应该被标记为。

答案 1 :(得分:0)

解决此问题的一种方法是使用构建系统,该系统允许您将库定义为仅测试并限制生产二进制文件使用它们。例如,bazel提供了testonly选项(http://bazel.io/docs/be/common-definitions.html#common.testonly

然后,将代码组织到主二进制文件库,测试库和测试代码中。这会给你一些类似的东西:     cc_library(       name =" foo",       srcs = [" foo.cc"],       hdrs = [" foo.h"],     )

cc_library(
  name = "test-utils",
  srcs = ["test-utils.cc"],
  hdrs = ["test-utils.h"],
  testonly = 1,
)

cc_test(
  ...
  deps = ["foo", "test-utils"],  # works
)

cc_libaray(
  ...
  deps = [..., "test-utils"],  # fails
)

cc_binary(
  ...
  deps = ["test-utils"],  # fails
)