以下代码在全局范围内无法编译:
const char *one = "1";
const char *two = "2";
char *nums[2] = {one, two};
错误消息是“初始化元素不是常量” - 这让我感到惊讶,因为变量1和2都被声明为常量。制作代号const
并不能解决问题。使用字符串文字声明nums(char *nums[2] = {"1", "2"};
)可以解决问题,但出于可读性的原因,我不想在实际代码中这样做。
有没有一种可行的方法让这个工作?
答案 0 :(得分:4)
C不允许变量进行全局初始化,即使这些变量本身是const
。与C ++相比,C有一个更为严格的“常量表达”概念。
目前,one
是一个可变指针,因此它不可能被视为一个常量表达式,但即使更正确的const char * const one = "1";
也不能用C表示。 (在C ++中没问题。)
你必须说:
const char * nums[2] = { "1", "2" };
答案 1 :(得分:1)
你可以试试#define
你的常数
#define ONE "1"
#define TWO "2"
/* const */ char *nums[2] = {ONE, TWO};
答案 2 :(得分:0)
const char *one = "1";
const char *two = "2";
这里一个和两个都是字符串const,而不管指定const限定符。
我的意思是char *one = "1"
;与const char *one = "1"
相同。
在C字符串中const
通过在声明期间定义来初始化,并且在程序执行期间保持不变。
char *nums[2];
是一个char指针数组,可以通过两种方式使用。
第一种方式:
const char *one = "1";
const char *two = "2";
char *num[2] = {"1","2"}; // this is same as creating array of string const
第二种方式:
const char *one = "1";
const char *two = "2";
main()
{
int len1 = strlen(one)+1;
int len2 = strlen(two)+1;
nums[0] = (char *)malloc(len1);
nums[1] = (char *)malloc(len2);
strcpy(nums[0],one);
strcpy(nums[1],two);
}