下面是一个例子,我试图将一个常量指针赋给结构中的一个常量指针,编译器不允许我这样做。但是我可以毫无问题地指定一个文本。如果你知道我的意思的话,我也试过不带任何常量和一些常量的情况,但是我还是不明白为什么编译器对文本很酷,但是在赋值中却有字符*的问题。
const char* cat_surname = "Snack";
typedef struct
{
const char* first;
const char* last;
}PET_T;
PET_T dog =
{
"Rover", // OK
"Cateater" // OK
};
PET_T cat =
{
"Tasty", // OK
cat_surname // ERROR :-(
};
我得到这个编译器错误:
错误:初始值设定项元素不是常量
使用Arch Linux gcc版本4.8.2 20140206(预发行版)(gcc)
最佳答案
要避免此问题,请将cat_surname
设置为const char
的数组,而不是指向const char
的指针。
const char cat_surname[] = "Snack";
PET_T cat = {
"Tasty",
cat_surname
};
注意:使用
const
并不意味着对象是常量。更像是“只读”。在下面,调用i
时,foo()
可能有不同的值,但函数foo
可能不会更改它。void foo(const int i) {
i = 5; // compile time error
}
在
const
中使用const char* cat_surname = "Snack";
并不意味着cat_surname
不能改变值。const
这里的意思是,不应试图按如下方式更改指向的数据:*cat_surname = 'X'; // bad
编译器错误“initializer element is not constant”需要一个真常量。数组是这样的:数组的第一个元素总是在同一个地址。
@Matt McNabb提出了一个很好的观点,即
cat_surname
的初始值可以是cat.last
。我没有一个强有力的理由为什么C不允许这样做。