【问题标题】:Init static variable with static variable in C99在 C99 中用静态变量初始化静态变量
【发布时间】:2017-05-13 17:28:17
【问题描述】:

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 足够常量吗? 如果不是,是否在某处定义了静态变量初始化顺序?

【问题讨论】:

标签: c c99


【解决方案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
};  

【讨论】:

    【解决方案2】:

    在静态区域中,所有变量如果已初始化,则必须使用Integer constants 和其他constant expressions 进行初始化。

    其他静态变量的值不被视为常量。

    常量是枚举数、原始数字(1、3.1、1e10...)、'c' 字符、字符串字面量“常量”、初始化列表,例如 {1,2,3}。

    来自6.7.8 Initialization的声明:

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

    【讨论】:

      猜你喜欢
      • 2011-08-22
      • 2010-12-22
      • 2010-12-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多