【发布时间】:2018-05-17 15:12:44
【问题描述】:
我读到块内的#defining 和#undefining 是代码异味。这是为什么?另外,我在代码中看到(只是一个示例,显示了我在实际代码中拥有的内容),这可以编译,
if(x == 1000) {
#define MACRO_EXAMPLE 1
} else {
#define MACRO_EXAMPLE 1
}
但这不会编译,
if(x == 1000) {
#define MACRO_EXAMPLE 1
} else {
#define MACRO_EXAMPLE 2
}
出现错误warning C4005: 'MACRO_EXAMPLE' : macro redefinition
如何进行预处理?它是如何工作的?
【问题讨论】:
-
您可以在编译时使用
if和ifdef指令来定义特定的宏,这本身并不是不好的做法。 -
这不是代码异味,它只是不起作用。
-
预处理器指令不注意除以“#”开头的行之外的任何内容。
-
有些人可能不同意,但实际上在大多数情况下我会反对他们。宏有其用处,但全局定义很快就会失控,尤其是
constexpr正在慢慢添加到事物中。 -
诸如此类的预处理器指令一直用于嵌入式软件开发。我认为上下文对这个问题很重要。我们在谈论什么样的平台?什么样的代码:低级驱动程序,还是高级接口的东西?即使在其中,宏的使用也取决于情况和用例。
标签: c++ c macros preprocessor