gpt4 book ai didi

C: 将 "static const char * const"分配给 "static const char *"

转载 作者:太空狗 更新时间:2023-10-29 17:01:46 32 4
gpt4 key购买 nike

我有一个程序,在文件顶部定义了一些全局字符串,如下所示:

static const char * const STRING_A = "STRING A";
static const char * const STRING_B = "STRING B";

然后在主程序循环中我反复调用一个函数。该函数包含一个指向上述字符串的指针,具体取决于用户输入。默认情况下,我希望它被设置为 STRING_A,所以我基本上拥有的是:

// Called repeatedly from a loop.
void input_function()
{
static const char *current = STRING_A;

// Do stuff and reassign different strings to "current"
...
}

我遇到的问题是在编译时出现“错误:初始化元素不是常量”。这是使用 GCC 4.7.2。更让我困惑的是,如果我去掉输入函数中的“static”关键字,错误就会消失。但这不是解决方案,因为函数需要 static 关键字来跟踪调用之间的当前字符串。

显然,我可以通过多种方式解决这个问题,最简单的方法就是去掉一些 const 限定符。但我想了解为什么这不起作用。

我目前的理解是全局字符串变量不能修改指向不同的字符串,也不能修改它们的个别字符。 static 关键字将它们保留在源文件的本地。

对于我函数中的 current 变量,我的理解是 static 关键字允许它在多次调用函数时保留其值,并且在这种情况下,const 限定符意味着字符串指向to by current 可以改变——但不能改变它指向的字符串的字符。

我在这些语句中没有看到任何冲突,所以我不明白为什么编译器会报错——尤其是为什么如果 current 的“static”没有问题说明符已删除。

如果有人能解释这里的问题,谢谢。

最佳答案

6.7.8/4 [C99]:

All the expressions in an initializer for an object that has static storage duration shall be constant expressions or string literals.

STRING_A 两者都不是,因此是错误。

解决此问题的方法如下:

void input_function()
{
static const char *current = NULL;
if (current == NULL) {
current = STRING_A;
}

...
}

关于C: 将 "static const char * const"分配给 "static const char *",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18163564/

32 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com