2016-12-29 219 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 char * const的足夠不變? 如果不是,是在什麼地方定義了靜態變量初始化順序?

+1

[*「地址常量表達式,爲...左值指定靜態存儲持續時間的對象或一個函數指示符,轉換爲指針「*」(http://en.cppreference.com/w/c/language/constant_expression) – StoryTeller

+1

問題是「它是否被正式允許?」。它編譯並且工作。問題是,我不確定它是否是有效的代碼。 – incogn1to

+1

@ incogn1to哪個編譯器?哪些選項?對於gcc,我得到'錯誤:初始化器元素不是常量' – 4386427

回答

1

在靜態區域中的所有變量,如果初始化,必須用Integer constantsconstant expressions初始化。

其他靜態變量的值不被視爲常量。

常量是枚舉數,原始數字(1,31,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 
    };