有人可以解释一下为什么这段代码...
// main.c
#include <stddef.h>
static const int g_a = 1;
static const char* g_b = "hello";
static const char* g_c[] = { "a", "b", NULL };
typedef struct Foo
{
int a;
const char* b;
const char** c;
} Foo;
static Foo f[] =
{
{ g_a,
g_b,
g_c }
};
int main( int argc, char* argv[] )
{
return 0;
}
...产生此错误:
> gcc --version && gcc -g main.c
gcc (GCC) 8.2.1 20181215 (Red Hat 8.2.1-6)
Copyright (C) 2018 Free Software Foundation, Inc.
This is free software; see the source for copying conditions. There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
main.c:19:5: error: initializer element is not constant
g_b,
^~~
main.c:19:5: note: (near initialization for 'f[0].b')
我知道编译器要求constant初始化f[0].b
,所以下面的初始化是编译错误的解决方案:
static Foo f[] = { { g_a, "hello", g_c } };
But 为什么编译器在初始化时不发出类似的“constant required”错误f[0].c
?(或者,就此而言,f[0].a
?) 为什么这只是一个问题f[0].b
?
f[0].a
具有类型“非常量int
" 并由以下值初始化g_a
其类型为“constint
“它不能在运行时更改,并且在编译时已知。所以这里没有错误。
f[0].b
具有类型“非常量指针const char
" 并且应该由以下值初始化g_b
这也是一个“非常量指针”const char
“。即使它有一个初始化程序g_b
可以在运行时改变,而IIRC的初始化顺序是不确定的。所以它的值在编译时是未知的,因此会出现错误。
f[0].c
具有类型“指向非常量指针的非常量指针const char
" 并由以下方式初始化g_c
这是一个“非常量指针”类型的元素数组const char
”。数组的符号可以用作常量指针,该指针在编译时就已知。所以这里没有错误。
我认为这就是你所缺少的:如果你想要一个指针const
,将修饰符放在指针后面*
,不是指定值,如下所示:[const] char * const pointer
.
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)