#if 与 if constexpr
#if Vs if constexpr
编译时配置(例如debug/release)、预处理器指令或if constexpr
?
哪个更合适?
#define DBG
#if DBG
// some code
#endif
// --------------------------------- or
inline constexpr bool DEBUG { true };
if constexpr ( DEBUG )
{
// some code
}
为此,您通常仍需要 #if
。 #if
可以做一些事情,比如改变你包含的头文件,改变定义的函数和类型,以及改变其他预处理器指令的定义。 if constexpr
做不到这些。
请注意,如果 if constexpr
是 而不是 模板的一部分,那么 if
的其他部分(例如 else
s) 仍在编译并检查有效性。
来自cppreference:
If a constexpr if statement appears inside a templated entity, and if condition is not value-dependent after instantiation, the discarded statement is not instantiated when the enclosing template is instantiated .
Outside a template, a discarded statement is fully checked. if constexpr is not a substitute for the #if preprocessing directive:
编译时配置(例如debug/release)、预处理器指令或if constexpr
?
#define DBG
#if DBG
// some code
#endif
// --------------------------------- or
inline constexpr bool DEBUG { true };
if constexpr ( DEBUG )
{
// some code
}
为此,您通常仍需要 #if
。 #if
可以做一些事情,比如改变你包含的头文件,改变定义的函数和类型,以及改变其他预处理器指令的定义。 if constexpr
做不到这些。
请注意,如果 if constexpr
是 而不是 模板的一部分,那么 if
的其他部分(例如 else
s) 仍在编译并检查有效性。
来自cppreference:
If a constexpr if statement appears inside a templated entity, and if condition is not value-dependent after instantiation, the discarded statement is not instantiated when the enclosing template is instantiated .
Outside a template, a discarded statement is fully checked. if constexpr is not a substitute for the #if preprocessing directive: