C++ 来自另一个静态常量变量的静态常量变量给出编译错误?
为什么要编译:C++ 来自另一个静态常量变量的静态常量变量给出编译错误?,c++,c,C++,C,为什么要编译: 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 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
的位置,但没有任何效果
我正在使用VisualStudio2019
编辑:它似乎在C++中工作,但不是C。所以我现在的问题是:
C标准不要求编译器在计算初始值设定项表达式时计算出组成对象的字节数。因此,虽然
*((const uint8_t*)和test_value)
可能有一个逻辑确定的值,您可以从test_value
的知识中计算出来,但编译器不需要计算出来
C 2018 6.8 7规定初始值设定项中使用的常量表达式可以是算术常量表达式、空指针常量、地址常量或地址常量加上或减去整数常量表达式。表达式*((const uint8_t*)和test_value)
不是后三种形式中的任何一种,因为它们是各种类型的指针。让我们考虑第一种形式,一种算术常量表达式。< /P>
C 2018 6.8 8定义了算术常数表达式:
算术常数表达式应具有算术类型,且只能具有整数常量、浮点常量、枚举常量、字符常量、结果为整数常量的表达式和表达式的操作数。算术常量表达式中的强制转换运算符只能将算术类型转换为算术类型,除非作为操作数的一部分转换为大小的
或\u对齐的
运算符
因此
*((const uint8_t*)和test_value)
不是一个算术常量表达式,因为它包含指针的强制转换,而不是算术类型,并且该强制转换不是sizeof
或\u Alignof
的操作数的一部分。它还包含test_value
作为操作数,而这不是列表中允许的操作数类型之一。它还包含作为操作数的&test\u value
,这也是不允许的类型之一。在C中,const-限定对象的内容不是常量;它们是只读的。你说的是哪种语言?C还是C++?它们是不同的语言,对于如何初始化静态对象也有不同的看法。这是C还是C++?它编译(VS 2019)作为C++,但不作为C…它们是具有不同规则的不同语言。当C编译器抱怨需要一个常量值时,它意味着一个在编译时也已知的值。取消对指针的引用不符合此条件。不,编译器对此一无所知。正如pmg已经提到的,const
only表示“只读”。这样的指针还可以指向时钟或类似的硬件寄存器,这些寄存器在运行时会发生明显的变化。。