只能由其他开发人员函数调用的C++开发人员函数
C++ Developer functions that can only be called by other developer functions
我们有许多函数对开发和测试非常有用,但不应该成为任何生产代码的一部分,主要是出于性能原因。我们的目标是让编译器确保标记为DEV_ONLY
的函数只能由具有相同标记的函数调用。
我该如何实现以下内容:
virtual int foo() DEV_ONLY;
int bar() {
foo(); // fails
}
int blah() DEV_ONLY {
foo(); // works
}
DEV_ONLY是宏还是其他什么?
到目前为止,已经提出了以下想法,但并不完全是我想要的:
易失性:我发现的一个选择是将它们标记为"易失性"(参见多布斯博士(,但我有两个问题。首先,它会滥用具有不同语义的说明符,这可能会在未来引发问题。其次,编译器关于函数"易失性"的警告没有那么大帮助。
friend:根据我的理解,这需要在实现这样一个方法的类中声明友谊。由于事先不知道使用该方法的测试或开发工具,所以我不是朋友解决方案的朋友。
不导出:可能使用也可能不使用该方法的代码甚至可能在同一个类中。
在Release构建中用noop替换:测试可能仍然需要Release模式中的那些方法。
#ifdef
预处理器指令应该是实现两个目标的最直接的方法:
- 不属于任何生产代码
- 确保只能从具有相同"标记"的函数中调用它们(如果它们不存在,则未定义DEV_only的构建将不会编译(
这意味着要包装函数体以及相应的调用。
至于在发布版本中应该可用的测试方法:那么它们不是DEV_ONLY,不应该标记为DEV_ONLY。
处理此问题的一种方法是使用一个构建系统,该系统允许您将库定义为仅测试库,并限制生产二进制文件使用它们。例如,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
)
- 如何用RISC-V GD32VF103CBT6开发板卸载精确的ADC过采样
- 我正在开发服务器,ip作为参数传递不起作用
- 如何使用 GPS 和指南针开发点移动算法
- AWS IoT 开发工具包:通过 TCP 端口 443 使用 MQTT
- 使用AAR的虚幻安卓开发
- 为什么开发人员将C / C ++用于嵌入式系统,而不是像Python这样的高级语言与C相比?
- 开发C++/地图中的控制台角色扮演游戏
- 测试驱动开发 c++:如何将对象添加到向量中,将歌曲添加到播放列表并对其进行测试
- 使用 AWS C++ 开发工具包分段上传 S3
- 如何在可视化代码中生成用于 c++ 开发的调试器?
- 与 AWS 开发工具包的链接问题
- CMake 工具链文件:嵌入式开发的适当值"CMAKE_SYSTEM_PROCESSOR"
- 错误:#include 在开发C++中嵌套得太深
- 使用代码在 AWS 开发工具包C++控制台应用程序上设置凭证
- 可视化配置 VS 代码以进行 C++ 编程和开发
- GCP 或 AWS 是否支持 C++ 和 GUI 应用程序开发?
- C++如何告诉开发人员在设计模板(如Java接口)时实现某事
- 在没有Xcode的macOS中开发具有依赖关系的应用程序
- 仅在标头开发中转发声明
- 如何使用 AWS C++ 开发工具包在给定的开始和结束日期范围内列出 S3 中的文件