2016-12-29 191 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 
    };