尝试使用#define将字符串数组分配给变量时出错(无效的初始化程序错误)

时间:2016-05-18 20:46:21

标签: c string macros variable-assignment

我正在尝试编译包含以下行的C代码:

//...
#ifdef CPU_GPREG_NAMES
static const char *reg_names[] = CPU_GPREG_NAMES;
#endif
//...

其中宏CPU_GPREG_NAMES定义为:

#define CPU_GPREG_NAMES                                            \
"zero", "at", "v0", "v1", "a0", "a1", "a2", "a3",                  \
"t0", "t1", "t2", "t3", "t4", "t5", "t6", "t7",                    \
"s0", "s1", "s2", "s3", "s4", "s5", "s6", "s7",                    \
"t8", "t9", "k0", "k1", "gp", "sp", "fp", "ra"                     \

但是,上面的第一个代码段中的分配似乎存在问题,因为我在该特定行上收到以下错误:

error: invalid initializer
error: expected identifier or '(' before string constant

此错误的原因是什么?

3 个答案:

答案 0 :(得分:2)

你忘记了大括号:

#define CPU_GPREG_NAMES  {                              \
    "zero", "at", "v0", "v1", "a0", "a1", "a2", "a3",   \
    "t0", "t1", "t2", "t3", "t4", "t5", "t6", "t7",     \
    "s0", "s1", "s2", "s3", "s4", "s5", "s6", "s7",     \
    "t8", "t9", "k0", "k1", "gp", "sp", "fp", "ra"      \
}

static const char *reg_names[] = {CPU_GPREG_NAMES};

答案 1 :(得分:2)

您需要花括号来为初始化程序定义数组。你可以这样做:

#define CPU_GPREG_NAMES { \
     "zero", ... \
     ... \
}

static const char *reg_names[] = {CPU_GPREG_NAMES};     

答案 2 :(得分:1)

您需要在初始化程序周围使用花括号。因为您正在初始化的是一个数组,所以大括号表示您正在设置该数组的多个元素:

#define CPU_GPREG_NAMES {                                          \
"zero", "at", "v0", "v1", "a0", "a1", "a2", "a3",                  \
"t0", "t1", "t2", "t3", "t4", "t5", "t6", "t7",                    \
"s0", "s1", "s2", "s3", "s4", "s5", "s6", "s7",                    \
"t8", "t9", "k0", "k1", "gp", "sp", "fp", "ra" }