![](/img/trans.png)
[英]C++ Give compiler error for setting a (static) const global variable to another static const variable
[英]static const variable from a another static const variable gives compile error?
为什么编译:
static const short test_value = 0x0100;
static const uint8_t *is_big_endian = ((const uint8_t *) &test_value);
但这不是:
static const short test_value = 0x0100;
static const uint8_t is_big_endian = *((const uint8_t *) &test_value);
出现错误:
表达式必须有一个常量值
我对此做了一些错误的理解并尝试了以下方法:
static uint8_t is_big_endian = *((const uint8_t *) &test_value);
哪个也没有编译并产生相同的错误!
我也尝试过使用const
的位置,但没有任何效果。
我正在使用 Visual Studio 2019。
编辑:
它似乎适用于 C++ 但不适用于 C。 所以现在我的问题是:
C 标准不要求编译器在评估初始化程序的表达式时找出构成 object 的字节。 因此,虽然*((const uint8_t *) &test_value)
可能有一个逻辑确定的值,您可以从test_value
的知识中找出它,但编译器不需要找出它。
C 2018 6.8 7 表示初始化器中使用的常量表达式可以是算术常量表达式、null 指针常量、地址常量或地址常量加上或减去 Z157DB7DF530023575E8ZD36 表达式。 表达式*((const uint8_t *) &test_value)
不是后三个 forms 中的任何一个,因为它们是各种类型的指针。 让我们考虑第一种形式,算术常量表达式。
C 2018 6.8 8 定义算术常数表达式:
算术常量表达式应具有算术类型,且操作数应为 integer 常量、浮点常量、枚举常量、字符常量、结果为 integer 常量和
_Alignof
表达式的sizeof
表达式。 算术常量表达式中的强制转换运算符只能将算术类型转换为算术类型,但作为sizeof
或_Alignof
运算符的操作数的一部分除外。
所以*((const uint8_t *) &test_value)
不是算术常量表达式,因为它包含指针的转换,而不是算术类型,并且该转换不是sizeof
或_Alignof
操作数的一部分。 它还包含test_value
作为操作数,这不是列表允许的操作数类型之一。 它还包含&test_value
作为操作数,这也不是允许的类型之一。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.