[問題] not a compile-time constant error

看板C_and_CPP (C/C++)作者 (「雄辯是銀,沉默是金」)時間11年前 (2015/02/17 11:09), 11年前編輯推噓3(3020)
留言23則, 4人參與, 最新討論串1/1
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

02/17 11:54, , 1F
因為 struct 不是這樣用的...
02/17 11:54, 1F

02/17 11:56, , 2F
static CmdForm param = { .name = "mask", .doc = mask_usa
02/17 11:56, 2F

02/17 11:56, , 3F
ge };
02/17 11:56, 3F

02/17 11:57, , 4F
在 C 語言的規格,const-qualified 變數不是 constant
02/17 11:57, 4F

02/17 11:57, , 5F
cppreference 在 Notes 有提到 http://goo.gl/7A6gmP
02/17 11:57, 5F

02/17 11:58, , 6F
亦可參考 ISO/IEC 9899 http://goo.gl/weMFU
02/17 11:58, 6F

02/17 12:00, , 7F
在 6.7.8 以及 6.6 都有詳細說明
02/17 12:00, 7F

02/17 13:24, , 8F
const char mask_usage[] = "mask netmask";
02/17 13:24, 8F

02/17 23:44, , 9F
linotwo: 謝謝, 我更加混亂了
02/17 23:44, 9F

02/17 23:57, , 10F
mask_usage 如果寫成陣列,就會是屬於編譯時期的常數
02/17 23:57, 10F

02/17 23:57, , 11F
因此寫成 char mask_usage[] = "mask netmask"; 就可以
02/17 23:57, 11F

02/17 23:59, , 12F
然而 const char *mask_ptr = "AA"; 你可以在執行階段
02/17 23:59, 12F

02/18 00:00, , 13F
把此指標重新指到另一常數字串 mask_usage = "BB";
02/18 00:00, 13F

02/18 00:00, , 14F
兩者是不同的...
02/18 00:00, 14F

02/18 00:00, , 15F
我上面打錯... 是 mask_ptr = "BB"; 特此修正
02/18 00:00, 15F
謝謝你的回答。 我把程式縮短了些, 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

02/18 00:40, , 16F
當為陣列時才會符合ISO/IEC 9899 的 6.6.9 所描述的
02/18 00:40, 16F

02/18 00:42, , 17F
編譯器會有能力把 mask_usage 轉成 &mask_usage[0]
02/18 00:42, 17F

02/18 00:43, , 18F
a pointer to an lvalue designating an object of
02/18 00:43, 18F

02/18 00:44, , 19F
static storage duration
02/18 00:44, 19F

02/18 00:45, , 20F
若是指標不管指到的是 const 或者本身是 const 都不行
02/18 00:45, 20F

02/18 00:45, , 21F
這也是預期的,因為這並不符合 6.6.9 所描述的規格
02/18 00:45, 21F

02/18 00:58, , 22F
然而這是符合 ISO/IEC 14882 的 5.19,所以 C++ 可以
02/18 00:58, 22F

02/18 01:18, , 23F
感謝回覆。
02/18 01:18, 23F
文章代碼(AID): #1Kuh3Leu (C_and_CPP)
文章代碼(AID): #1Kuh3Leu (C_and_CPP)