在结构初始化中定义常量变量

时间:2015-08-16 17:45:44

标签: c

我尝试按照以下link启动我的数据:

struct dmparam {
    char *p;
    char *v;
};

struct dmobj {
    int a;
    int b;
    const struct dmparam * const *dmparam;
};


const struct dmobj dmobj[] = {
    {1, 11, NULL},
    {2, 22,
        (struct dmparam  * const []) {//params
        {"p1", "v1"},
        {"p2", "v2"},
        }//params
    },
    {3, 33, NULL},
};

但是我在编辑中收到了警告

test.c:35:3: warning: braces around scalar initializer [enabled by default]
   {"p1", "v1"},
   ^
test.c:35:3: warning: (near initialization for ‘(anonymous)[0]’) [enabled by default]
test.c:35:3: warning: initialization from incompatible pointer type [enabled by default]
test.c:35:3: warning: (near initialization for ‘(anonymous)[0]’) [enabled by default]
test.c:35:3: warning: excess elements in scalar initializer [enabled by default]
test.c:35:3: warning: (near initialization for ‘(anonymous)[0]’) [enabled by default]
test.c:36:3: warning: braces around scalar initializer [enabled by default]
   {"p2", "v2"},
   ^
test.c:36:3: warning: (near initialization for ‘(anonymous)[1]’) [enabled by default]
test.c:36:3: warning: initialization from incompatible pointer type [enabled by default]
test.c:36:3: warning: (near initialization for ‘(anonymous)[1]’) [enabled by default]
test.c:36:3: warning: excess elements in scalar initializer [enabled by default]
test.c:36:3: warning: (near initialization for ‘(anonymous)[1]’) [enabled by default]
test.c:38:2: warning: initialization from incompatible pointer type [enabled by default]
  },
  ^
test.c:38:2: warning: (near initialization for ‘dmobj[1].dmparam’) [enabled by default]

我缺少什么?

1 个答案:

答案 0 :(得分:1)

您只缺少两个指数级别。 dmobj::dmparam是(暂时忘记const struct dmparam **,它指向指向(const)dmparam的(const)指针。

编译器尝试使用dmparam数组直接初始化,而不是使用指向指针的指针进行初始化。 Clang警告是显式的:不兼容的指针类型使用类型为'char [3]'的表达式初始化'struct dmparam * const'。编译器不够聪明,无法猜出你想要的东西......

你必须在这里明确:

const struct dmparam  params [] = {
        {"p1", "v1"},
        {"p2", "v2"},
};

const struct dmparam * const p = params;

const struct dmobj dmobj[] = {
    {1, 11, NULL},
    {2, 22, &p },
    {3, 33, NULL},
};

此处paramsconst dmparam的数组,p是指向params(另一个变量)的const指针,并且您输入p的地址在dmobj[1]