C:将"static const char*const"赋给"static const char*"

Ada*_*win 8 c static gcc pointers const

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

static const char * const STRING_A = "STRING A";
static const char * const STRING_B = "STRING B";
Run Code Online (Sandbox Code Playgroud)

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

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

    // Do stuff and reassign different strings to "current"
    ...
}
Run Code Online (Sandbox Code Playgroud)

我遇到的问题是,在编译时我得到"错误:初始化元素不是常量".这是使用GCC 4.7.2.更让我困惑的是,如果我在输入函数中删除了"static"关键字,那么错误就会消失.这不是一个解决方案,因为函数需要static关键字来跟踪调用之间的当前字符串.

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

我目前的理解是全局字符串变量不能被修改为指向不同的字符串,也不能修改它们各自的字符.static关键字将它们保持为源文件的本地.

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

我没有看到这些语句中的任何冲突,所以我不明白为什么编译器会出错 - 特别是为什么如果current删除了"静态"说明符它没有问题.

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

NPE*_*NPE 7

6.7.8/4 [C99]:

具有静态存储持续时间的对象的初始化程序中的所有表达式应为常量表达式或字符串文字.

STRING_A 既不是,也就是错误.

解决这个问题的方法有以下几点:

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

    ...
}
Run Code Online (Sandbox Code Playgroud)