"static const char array"可以在 C 语言上包含变量成员吗

Can "static const char array" include a member of variable on C language

本文关键字:语言上 包含 变量 成员 const static char array      更新时间:2023-10-16

我的代码如下

#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("%sn",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 上的静态常量 *char 数组中包含变量的成员?请帮帮我!

在 C 语言中,静态存储持续时间对象的初始值设定项必须是常量表达式

变量的值从来都不是常量表达式,即使它是 const 限定变量也是如此。

因此,您不能将 a 的值用作 comb_ab 的初始值设定项。

在C++初始值设定项可能具有运行时评估。

要修复C版本,你可以comb_ab非静态的,并在main内部定义;或者你可以在main里面有代码,用正确的值"初始化"全局comb_ab


此外,您

有一个类型不匹配:您尝试使用const char *来初始化char *。但即使你解决了这个问题,以前的问题仍然存在。使用 g++,您应该对此进行编译器诊断。

您可以使用具有静态存储持续时间的对象地址作为常量表达式,但代价是另一个级别的间接寻址。这在 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("%sn", *comb_ab[i]);
    }
}

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

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