我的代码正在关注
#include <stdio.h>
static const char *a ="this is a";
static const char *b ="this is b";
char *comb_ab[2] =
{
a,
b
};
int main() {
int i=0;
for(i=0; i<sizeof(comb_ab)/sizeof(comb_ab[0]); i++) {
printf("%s\n",comb_ab[i]);
}
}
此代码通常用于G ++编译器(C ++)。但海湾合作委员会没有工作.. 输出如下
test.c:8:2: error: initializer element is not constant
a,
^
test.c:8:2: error: (near initialization for ‘comb_ab[0]’)
test.c:10:1: error: initializer element is not constant
};
^
test.c:10:1: error: (near initialization for ‘comb_ab[1]’)
如何在gcc的静态const * char数组中包含变量的变量? 请帮帮我!
答案 0 :(得分:6)
在C中,静态存储持续时间对象的初始值设定项必须是常量表达式。
变量的值永远不是常量表达式,即使它是const
- 限定变量。
因此,您无法使用a
的值作为comb_ab
的初始化程序。
在C ++中,初始化程序可能有运行时评估。
要修复C版本,您可以使comb_ab
非静态并在main
内定义;或者您可以在main
内部使用正确值“初始化”全局comb_ab
的代码。
您的类型也不匹配:您尝试使用const char *
初始化char *
。但即使你解决了这个问题,前一个问题仍然存在。使用g ++你应该有一个关于它的编译器诊断。
答案 1 :(得分:3)
您可以将具有静态存储持续时间的对象地址用作常量表达式,代价是另一个间接层。这在C中被正式称为地址常量(C11,§6.6/ 9)。
#include <stdio.h>
static const char *a = "this is a";
static const char *b = "this is b";
static const char **comb_ab[2] =
{
&a,
&b
};
int main()
{
for (int i = 0; i < sizeof(comb_ab)/sizeof(comb_ab[0]); i++) {
printf("%s\n", *comb_ab[i]);
}
}
当然,将a
和b
文字与数组合并会更简单。考虑以下设计:
static const char *comb_ab[] =
{
"this is a",
"this is b",
};