在project中,我使用CMake模块WriteCompilerDetectionHeader来检测C ++ 11功能是否可用。该模块生成一个文件,其中包含static_assert
等某些功能的兼容性实现:如果该功能可用,则为该功能声明的宏将扩展为该功能;否则会扩大到一些后备。
功能constexpr
没有兼容性实现。我尝试提供一个并最终得到一个双重实现:一个用于constexpr变量,另一个用于constexpr函数。
在cmake文件中:
write_compiler_detection_header(
FILE "${CMAKE_CURRENT_BINARY_DIR}/foo-compilerdetection.h"
PREFIX Foo
COMPILERS
GNU
MSVC
FEATURES
cxx_constexpr
)
在全局标题中:
#include "foo-compilerdetection.h"
#ifdef Foo_COMPILER_CXX_CONSTEXPR
# define Foo_CONSTEXPR_FUNCTION constexpr
# define Foo_CONSTEXPR_OBJECT constexpr
#else
# define Foo_CONSTEXPR_FUNCTION inline
# define Foo_CONSTEXPR_OBJECT const
#endif
因此,变量constexpr
将替换为限定符const
,对于函数,它将替换为限定符inline
。
这些替换是否足够?其他限定符或组合或限定符是否更适合并且可能适用于变量和函数?
答案 0 :(得分:0)
我认为这不是那么简单。在编译期间计算constexpr
。 const
和inline
不是。
我想说,对于constexpr
变量,您必须考虑两种可能性:const
(您使用过的)和预处理器宏(即#define PI 3.14)。一方面是尊重范围,调试等,另一方面是严格的编译时间。
说到constexpr
函数,它有点棘手。这样的函数可以在编译时计算但是没有必要。如果你正在进行编译时评估,你应该考虑模板和预处理器(我知道宏是邪恶的但是......)。如果我们正在讨论应该在运行时进行评估的函数,那么内联或模板是最好的选择。
预处理器宏是我所知道的constexpr
的唯一替换,可以在switch
语句(作为case
标签)或数组分配(int tab[5];
)中使用< / p>