类的条件编译

Conditional compilation of class

本文关键字:编译 条件      更新时间:2023-10-16

>通常,对于我不打算包含在生产代码中的类,我有条件运算符,例如通常:

#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_VERSIONRELEASE_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_VERSIONRELEASE_VERSION没有在相应的分支中定义(如在标头"定义"中)。

为了使其尽可能安全,您应该始终拥有两个具有两个定义的分支,因此我给出的第一个示例应改进为:

#ifdef DEBUG_VERSION
DEBUG_VERSION
// ...
#else
RELEASE_VERSION
#endif

即使发布分支不包含其他代码/语句。这样你就可以捕获大多数错误,我认为这是非常描述性的。由于 DEBUG_VERSION 仅在调试分支中被替换为任何内容,因此所有拼写错误都会导致编译时错误。RELEASE_VERSION也是如此.