我们有许多功能对开发和测试非常有用,但不应该是任何高效代码的一部分 - 主要是出于性能原因。我们的目标是让编译器确保标记为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替换:测试可能仍然需要在发布模式下使用这些方法。
答案 0 :(得分:1)
#ifdef
预处理程序指令应该是实现两个目标的最直接的方法:
这意味着包装函数体以及相应的调用。
关于发布版本中应该可用的测试方法:那么它们不是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
)