c++ - 类的条件编译

标签 c++ c c-preprocessor

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

#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_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 未在相应的分支中定义(如 header 中的“defined away”)。

为了尽可能安全,您应该始终让两个分支都有两个定义,所以我给出的第一个示例应该改进为:

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

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

关于c++ - 类的条件编译,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19499889/

相关文章:

使用函数更改指针包含的地址

使用父类型时覆盖 C++ 方法

c++ - 如何设置时间延迟以触发 Qt 中即将发生的事件

c++ - 我可以从崩溃签名获取源代码(Windows崩溃报告)

c - 如何判断用户输入的小数位有多少位?

c - 在 C 中连接多个字符串的更好方法是什么

c++ - GLSL - 在 SSB 中解压 (V2)

xcode - 抑制: "#warning is language extension"

c - 适当的 C 预处理器宏空操作

c++ - 从 Intellisense 隐藏 C++ 代码块