可以"静态const char数组"在C语言中包含变量的成员

时间:2017-01-06 07:06:49

标签: c++ c linux gcc

我的代码正在关注

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

2 个答案:

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

当然,将ab文字与数组合并会更简单。考虑以下设计:

static const char *comb_ab[] =
{
    "this is a",
    "this is b",
};