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

标签 c pointers gcc static constants

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

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/

相关文章:

c - select() 超时后不返回

c - 将字符存储在数组中,C

c - 从二维字符数组指针获取字符,该指针是 C 中结构指针的属性

c - 如何指向整个数组

c - x86 gcc 程序集输出帮助请

C++。 RNG 是否有可能在使用相同种子的两台不同机器中给出不同的随机变量?

c - 有什么方法可以在规范模式下处理转义键吗?

c - 多维数组中的字符串没有终止 NUL 字符?

c - Arduino:无法将 union 结构作为指针 ac 传递,我可以使用 gcc 编译器

c - getch(ncurses)返回值在程序之间如何不同?