【问题标题】:define constant variable in a structure initiation在结构初始化中定义常量变量
【发布时间】:2015-11-09 08:47:05
【问题描述】:

我尝试关注以下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]

我错过了什么?

【问题讨论】:

  • 还有这个问题吗?您希望通过(struct dmparam * const []) { ... } 实现什么? struct dmobjdmparam 是指向 dmparam 的指针。你能澄清一下你的目标吗?
  • 1) 不要为类型和变量/字段使用相同的名称。 2) 你需要指针的地址。
  • @FilipeGonçalves:如果这是一个重复,你有链接吗?
  • @Olaf 他两天前问了一个代码非常相似的问题:stackoverflow.com/questions/32014285/…
  • @FilipeGonçalves:同意。那是一个骗局,你得到了答案。

标签: c


【解决方案1】:

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

编译器没有使用指向指针的指针进行初始化,而是尝试直接使用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(另一个变量)的常量指针,你把p的地址放在dmobj[1]中。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-08-18
    • 2018-10-18
    • 1970-01-01
    • 2013-03-15
    • 1970-01-01
    • 2013-08-30
    • 2014-05-25
    • 1970-01-01
    相关资源
    最近更新 更多