2016-12-29 17 views
1

静的配列をC99に初期化することはできますか? 例:C99の静的変数を持つ初期静的変数

static const char * const PATH1 = "/home/usr"; 
static const char * const PATH2 = "/usr/"; 
static const char * const PATH3 = "."; 

static const char *path_list[] = { 
    PATH1, 
    PATH2, 
    PATH3, 
    0 
}; 

int main() 
{ 
    char **path = (char **)path_list; 

    while(*path) 
    { 
     printf("path[%s]\n", *path); 
     path++; 
    } 

    return 0; 
} 

私はC標準§6.7.8から理解されるように:

1644 All the expressions in an initializer for an object that has static storage duration shall be constant expressions or string literals.

は十分CONST定数*のconstのcharですか? そうでない場合は、静的変数の初期化順序がどこかで定義されていますか?

+1

[* "静的記憶期間のオブジェクトを指す左辺値である定数式、...のアドレスまたはポインタを "*"に変換した関数指定子(http://en.cppreference.com/w/c/language/constant_expression) – StoryTeller

+1

質問は "公式に許可されていますか?"です。それはコンパイルして動作します。問題は、それが有効なコードであることがわかりません。 – incogn1to

+1

@ incogn1toどのコンパイラ?どのオプション? gccで 'error:initializer要素は定数ではありません ' – 4386427

答えて

1

、初期化した場合、Integer constantsおよびその他のconstant expressionsで初期化する必要があります。

他の静的変数の値は定数と見なされません。

定数は列挙子、生の数字(1、3.1、1e10 ...)、 'c'文字、文字列リテラル "定数"、{1,2,3}のようなイニシャライザリストです。

6.7.8 Initializationから:

  • All the expressions in an initializer for an object that has static storage duration shall be constant expressions or string literals.
  • 1

    変数の値は常に「実行時」とみなされ、静的変数またはグローバル変数の初期化子は「コンパイル時」である必要があります。あなたが書いたことはうまくいかないでしょう。あなたはもちろん行うことができますが、プリプロセッサを使用しているすべての変数の静的ゾーンで

    #define C_PATH1 "/home/usr" 
    #define C_PATH2 "/usr/" 
    #define C_PATH3 "." 
    
    static const char * const PATH1 = C_PATH1; 
    static const char * const PATH2 = C_PATH2; 
    static const char * const PATH3 = C_PATH3; 
    
    static const char *path_list[] = { 
        C_PATH1, 
        C_PATH2, 
        C_PATH3, 
        0 
    };