C++中使用constexpr进行大小声明是否正确?
关于宏定义中使用constexpr的问题
你这段代码里在#define宏里加constexpr的用法是完全错误的,原因如下:
#define是预处理器指令,预处理器在编译阶段前运行,它根本不认识C的constexpr关键字,会把constexpr当作普通文本直接替换到代码里。展开后会出现类似(constexpr ((size_t)1) * (size_t)1024)的代码,这在C语法里是非法的,会直接导致编译报错。constexpr是用来修饰变量、函数等,让它们成为编译期常量的关键字,不能放在表达式中间作为修饰符使用。
正确的实现方式
推荐:用constexpr变量替代宏(C++风格)
这是C++里定义编译期常量的标准做法,类型安全、有作用域,还能避免宏的各种坑:
constexpr size_t BYTE = 1; constexpr size_t KIB = BYTE * 1024; constexpr size_t MIB = KIB * 1024; constexpr size_t GIB = MIB * 1024;
这些变量会在编译期计算出结果,和宏一样高效,但比宏更安全。
备选:如果一定要用宏(不推荐)
直接去掉constexpr,预处理器会自动在编译前计算常量表达式,结果也是编译期可用的常量:
#define BYTE ((size_t)1) #define KIB (BYTE * (size_t)1024) #define MIB (KIB * (size_t)1024) #define GIB (MIB * (size_t)1024)
但宏没有类型检查,容易出现意外的文本替换问题,除非有特殊需求,否则优先用constexpr变量。
内容的提问来源于stack exchange,提问作者Ali Ersahan
相关产品推荐
相关产品推荐

