看板 C_and_CPP 關於我們 聯絡資訊
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 則編得過。 -- ※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 60.248.61.61 ※ 文章網址: https://www.ptt.cc/bbs/C_and_CPP/M.1424142549.A.A38.html ※ 編輯: descent (60.248.61.61), 02/17/2015 11:17:38
OPIV: 因為 struct 不是這樣用的... 02/17 11:54
OPIV: static CmdForm param = { .name = "mask", .doc = mask_usa 02/17 11:56
OPIV: ge }; 02/17 11:56
LiloHuang: 在 C 語言的規格,const-qualified 變數不是 constant 02/17 11:57
LiloHuang: cppreference 在 Notes 有提到 http://goo.gl/7A6gmP 02/17 11:57
LiloHuang: 亦可參考 ISO/IEC 9899 http://goo.gl/weMFU 02/17 11:58
LiloHuang: 在 6.7.8 以及 6.6 都有詳細說明 02/17 12:00
linotwo: const char mask_usage[] = "mask netmask"; 02/17 13:24
descent: linotwo: 謝謝, 我更加混亂了 02/17 23:44
LiloHuang: mask_usage 如果寫成陣列,就會是屬於編譯時期的常數 02/17 23:57
LiloHuang: 因此寫成 char mask_usage[] = "mask netmask"; 就可以 02/17 23:57
LiloHuang: 然而 const char *mask_ptr = "AA"; 你可以在執行階段 02/17 23:59
LiloHuang: 把此指標重新指到另一常數字串 mask_usage = "BB"; 02/18 00:00
LiloHuang: 兩者是不同的... 02/18 00:00
LiloHuang: 我上面打錯... 是 mask_ptr = "BB"; 特此修正 02/18 00:00
謝謝你的回答。 我把程式縮短了些, m 應是你說的那種 type, 不過以下程式碼無法通過 c compiler。 const char * const m="mask netmask"; // fail const char * p = m; int main(int argc, char *argv[]) { return 0; } ※ 編輯: descent (182.234.91.197), 02/18/2015 00:36:57
LiloHuang: 當為陣列時才會符合ISO/IEC 9899 的 6.6.9 所描述的 02/18 00:40
LiloHuang: 編譯器會有能力把 mask_usage 轉成 &mask_usage[0] 02/18 00:42
LiloHuang: a pointer to an lvalue designating an object of 02/18 00:43
LiloHuang: static storage duration 02/18 00:44
LiloHuang: 若是指標不管指到的是 const 或者本身是 const 都不行 02/18 00:45
LiloHuang: 這也是預期的,因為這並不符合 6.6.9 所描述的規格 02/18 00:45
LiloHuang: 然而這是符合 ISO/IEC 14882 的 5.19,所以 C++ 可以 02/18 00:58
descent: 感謝回覆。 02/18 01:18