[问题] not a compile-time constant error

楼主: descent (“雄辩是银,沉默是金”)   2015-02-17 11:09:05
const char *mask_usage="mask netmask";
typedef struct
{
const char *name;
const char *doc;
}CmdForm;
static CmdForm parameter[] =
{
{"mask", mask_usage}
};
int main(int argc, char *argv[])
{
return 0;
}
~
clang-3.6 a.c
a.c:14:12: error: initializer element is not a compile-time constant
{"mask", mask_usage}
^~~~~~~~~~
1 error generated.
请问 mask_usage 为什么不是 compile-time constant?
c++ compiler 则编得过。
作者: OPIV (Monitor)   2015-02-17 11:54:00
因为 struct 不是这样用的...static CmdForm param = { .name = "mask", .doc = mask_usage };
作者: LiloHuang (十年一刻)   2015-02-17 11:57:00
在 C 语言的规格,const-qualified 变量不是 constantcppreference 在 Notes 有提到 http://goo.gl/7A6gmP亦可参考 ISO/IEC 9899 http://goo.gl/weMFU在 6.7.8 以及 6.6 都有详细说明
作者: linotwo (._.)   2015-02-17 13:24:00
const char mask_usage[] = "mask netmask";
楼主: descent (“雄辩是银,沉默是金”)   2015-02-17 23:44:00
linotwo: 谢谢, 我更加混乱了
作者: LiloHuang (十年一刻)   2015-02-17 23:57:00
mask_usage 如果写成阵列,就会是属于编译时期的常数因此写成 char mask_usage[] = "mask netmask"; 就可以然而 const char *mask_ptr = "AA"; 你可以在执行阶段把此指标重新指到另一常数字串 mask_usage = "BB";两者是不同的...我上面打错... 是 mask_ptr = "BB"; 特此修正当为阵列时才会符合ISO/IEC 9899 的 6.6.9 所描述的编译器会有能力把 mask_usage 转成 &mask_usage[0]a pointer to an lvalue designating an object ofstatic storage duration若是指标不管指到的是 const 或者本身是 const 都不行这也是预期的,因为这并不符合 6.6.9 所描述的规格然而这是符合 ISO/IEC 14882 的 5.19,所以 C++ 可以
楼主: descent (“雄辩是银,沉默是金”)   2015-02-18 01:18:00
感谢回复。

Links booklink

Contact Us: admin [ a t ] ucptt.com