是否允许在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初始值设定项中具有的对象的所有表达式 静态存储持续时间应为常量表达式或字符串 文字。
const char * const是否足够常量? 如果没有,是否在某处定义了静态变量初始化顺序?
答案 0 :(得分:2)
在静态区域中,所有变量(如果已初始化)必须使用Integer constants
和其他constant expressions
进行初始化。
其他静态变量的值不被视为常量。
常量是枚举数,原始数字(1,1.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 :(得分: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
};