在C99中用静态变量初始化静态变量
Init static variable with static variable in 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 常量够不够?
如果不是,是否在某处定义了静态变量初始化顺序?
变量的值将始终被视为 "run time",而静态或全局变量的初始值设定项必须是 "compile time"。所以你写的是行不通的。你当然可以做的是使用预处理器:
#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
};
在静态区所有变量,如果初始化,必须用Integer constants
和其他constant expressions
初始化。
其他静态变量的值不被视为常量。
常量是枚举数、原始数字(1、3.1、1e10...)、'c' 个字符、字符串文字 "constant"、初始化列表,例如 {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.
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 常量够不够? 如果不是,是否在某处定义了静态变量初始化顺序?
变量的值将始终被视为 "run time",而静态或全局变量的初始值设定项必须是 "compile time"。所以你写的是行不通的。你当然可以做的是使用预处理器:
#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
};
在静态区所有变量,如果初始化,必须用Integer constants
和其他constant expressions
初始化。
其他静态变量的值不被视为常量。
常量是枚举数、原始数字(1、3.1、1e10...)、'c' 个字符、字符串文字 "constant"、初始化列表,例如 {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.