您可以在C语言中使用const
关键字定义常量吗?
我发现有冲突的信息。
使用#define宏并对值进行硬编码以进行测试。在这种情况下,代码可以编译,但是当我使用const关键字时会抛出错误。
int main(void){
const int TESTARRAYSIZE = 7;
float user_array[TESTARRAYSIZE] = {5.1, 7.2, 5.1, 8.45, 23.0,
67.123, 5.1};
float number_in_question = 5.1;
float frequency;
frequency = user_array[1];
printf("%.2f", frequency);
return(0);
}
编译错误:
<filename>:22:3: error: variable-sized object may not be initialized
但是由于常量未设置值,因此该错误似乎很大程度上即将到来。
答案 0 :(得分:3)
使用const
类型限定符并不能使某些常数。 C中的常量有其自己的定义。
有关const
关键字的说明,请参见C11标准的§6.7.3¶6:
如果尝试通过使用具有非const限定类型的左值来修改以const限定类型定义的对象,则该行为未定义。如果尝试通过使用具有非挥发性限定类型的左值来引用以挥发性限定类型定义的对象,则该行为是不确定的。
您需要的是一个常量表达式;有关详细信息,请参见C11的6.6。
如果您真正想知道的是不是“ {@ {1}}限定词已经达到WTF?”但是,对于您的代码而言,正确的解决方案是什么,答案很可能根本没有指定数组的大小:
const
这通常被认为是好的做法,因为它实际上使您的代码更健壮。
答案 1 :(得分:1)
编译器会抛出错误,因为在使用堆栈存储器时,变量是由编译器在预编译阶段分配的,在此阶段,数组的大小必须是编译器已知的值
如您所说,如果您#define
的值是已知的硬编码值,则不会有错误。