类的条件编译
Conditional compilation of class
>通常,对于我不打算包含在生产代码中的类,我有条件运算符,例如通常:
#ifdef DEBUG_VERSION
这也可能与在开发模式下执行其他步骤的某些代码块有关。
我刚刚想过(多年后或使用上述内容):如果在上面引入了错别字会怎样?这可能会产生巨大的后果。包含(或不包含)相反意图的代码段。
所以我现在想知道替代方案,并考虑创建 2 个宏:
INCLUDE_IN_DEBUG_BUILD
END_INCLUDE_IN_DEBUG_BUILD
如果在这些中创建了拼写错误,则会在编译时创建错误消息,强制用户更正它。第一个在调试版本中计算为"if (1){",在生产版本中计算为"if (0){",因此任何值得使用的编译器都应该优化这些行,即使它们没有,至少里面的代码永远不会被调用。
现在我想知道:我在这里缺少什么吗?为什么没有其他人使用这样的东西?
更新:我用基于构建系统的方法替换了基于标头的方法。
您不仅希望能够禁用函数中的部分代码,还希望能够在类或命名空间内等其他区域禁用:
struct my_struct {
#ifdef DEBUG_VERSION
std::string trace_prefix;
#endif
};
所以真正的问题似乎是:如何防止#ifdef
中的错别字?这里有一些不会限制你的东西,应该运作良好。
修改构建系统以定义DEBUG_VERSION
或RELEASE_VERSION
。确保这一点应该很容易。将这些定义为零,例如 -DDEBUG_VERSION
或-DRELEASE_VERSION
用于 GCC/Clang。
有了这个,你可以像这样保护你的代码:
#ifdef DEBUG_VERSION
DEBUG_VERSION
// ...
#endif
或
#ifndef DEBUG_VERSION
DEBUG_VERSION
// ...
#else
RELEASE_VERSION
// ...
#endif
瞧,在上面的第二个示例中,我已经添加了一个小错别字:#ifndef
而不是#ifdef
- 但编译器现在会抱怨,因为DEBUG_VERSION
和RELEASE_VERSION
没有在相应的分支中定义(如在标头"定义"中)。
为了使其尽可能安全,您应该始终拥有两个具有两个定义的分支,因此我给出的第一个示例应改进为:
#ifdef DEBUG_VERSION
DEBUG_VERSION
// ...
#else
RELEASE_VERSION
#endif
即使发布分支不包含其他代码/语句。这样你就可以捕获大多数错误,我认为这是非常描述性的。由于 DEBUG_VERSION
仅在调试分支中被替换为任何内容,因此所有拼写错误都会导致编译时错误。RELEASE_VERSION
也是如此.
- 访问条件类成员的方法不仅在被调用时才编译
- 如何使用 soong 命名空间来有条件地编译模块
- 如何摆脱为条件编译定义预处理器宏的需要?
- C++中的条件运算符 ( ? : ) 可以编译时吗?
- 使用 constexpr 替换 #define 和 #ifdef 进行条件编译
- 编译时条件包含.分段标头与包括整个实现
- 如何在Visual Studio 2019中有条件地编译c++源文件
- 基于宏中传递的字符串的条件编译
- 如果条件取决于模板类型并且在编译时已知,是否可以保证C++编译器不会生成分支?
- 从语言设计层面来看,当编译时无法推断条件时,为什么"if constexpr"不衰减到"trival if"
- C++代码在 for 循环的条件下给出运行时错误,而如果它被具有相同意义的代码替换,则编译正确
- Eclipse CDT 条件编译?
- 用于根据条件选择编译时类型的可变参数模板
- 除了使用 #define 进行条件编译之外,还有其他选择吗?
- 如何编译模板类型名的时条件
- 为什么有条件编译运算符模板会更改另一个运算符的可用性?
- C 模板:如何根据数据类型有条件编译不同的代码
- 是否可以在编译时评估使用 std::is_same<> 的此条件?
- 根据编译时条件在类型之间选择类型的惯用方法
- 如果constexpr(条件)为编译时条件