[問題] 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