在C语言中,“static const char array”可以包含一个变量成员吗?

4

我的代码如下所示

#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++)上正常运行,但是在 GCC 上无法工作... 输出如下:

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数组中包含变量成员? 请帮助我!

4
你试图用 const char * 来初始化 char *,这是一种类型不匹配。请检查你的 g++ 编译器输出。 - M.M
1
请注意,const char *a 是指向常量字符数组的非常量指针,如果您需要一个常量指针,则需要 char const * const a - Holt
g++.exe (tdm-1) 5.1.0 上测试后,代码无法编译,这是预期的结果,因为 static const char * 意味着“指向具有内部链接和静态持续时间寿命的常量字符的指针”,但你正在将其初始化为“指向非常量字符的指针数组”。 - raymai97
2个回答

6
在C语言中,静态存储期对象的初始化器必须是常量表达式。即使一个变量被const限定,它的值也不是常量表达式。
因此,您不能将变量a的值用作comb_ab的初始化器。
在C++中,初始化器可以进行运行时评估。
要解决C版本的问题,您可以使comb_ab成为非静态对象并在main函数内定义; 或者您可以在main函数内编写代码,以正确的值“初始化”全局变量comb_ab。
此外,您存在类型不匹配的问题:您尝试使用const char *来初始化char *。但即使您修复了这个问题,之前的问题仍然存在。如果您使用g ++编译器,应该会有一个编译器诊断信息。

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]);
    }
}

当然,将ab文字与数组合并在一起会更简单。请考虑以下设计方案:
static const char *comb_ab[] =
{
    "this is a",
    "this is b",
};

1
另一个选项是将ab作为const char数组:static const char a[] = "this is a"; static const char b[] = "this is b"; static const char *comb_ab[2] = { a, b }; - Ian Abbott

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接