通常,对于我不打算包含在生产代码中的类,我有条件运算符,例如:
#ifdef DEBUG_VERSION
这也可能围绕某些代码块,这些代码块在开发模式下执行额外的步骤。
我只是想(多年后或使用上面的):如果在上面引入错字会怎样?它可能会产生很大的后果。在相反的情况下包含(或不包含)代码片段。
所以我现在想知道替代方案,并考虑创建 2 个宏:
INCLUDE_IN_DEBUG_BUILD
END_INCLUDE_IN_DEBUG_BUILD
如果其中出现拼写错误,则会在编译时创建一条错误消息,迫使用户更正它。第一个将在调试版本中评估为“if (1){”,在生产版本中评估为“if (0){”,因此任何值得使用的编译器都应该优化这些行,即使他们不这样做,至少里面的代码永远不会被调用。
现在我想知道:我是否遗漏了什么?为什么没有其他人使用这样的东西?
最佳答案
更新:我用基于构建系统的方法替换了基于 header 的方法。
您不仅希望能够禁用函数内的部分代码,还希望能够禁用其他区域,例如类或命名空间内的代码:
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
未在相应的分支中定义(如 header 中的“defined away”)。
为了尽可能安全,您应该始终让两个分支都有两个定义,所以我给出的第一个示例应该改进为:
#ifdef DEBUG_VERSION
DEBUG_VERSION
// ...
#else
RELEASE_VERSION
#endif
即使发布分支不包含其他代码/语句。这样你就可以捕捉到大多数错误,我认为它非常具有描述性。由于 DEBUG_VERSION
仅在调试分支中被替换为空,所有拼写错误都将导致编译时错误。 RELEASE_VERSION
也是如此。
关于c++ - 类的条件编译,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19499889/