【问题标题】:How to do this initialization?这个初始化怎么做?
【发布时间】:2014-04-22 09:17:04
【问题描述】:

我有一个结构,我需要在编译时对其进行初始化。这是当前(伪)代码:

struct A
{
    int a;
    int b;
};

struct B
{
    struct A а[16][3];
};

#define DEFAULT {{ \
                   .a = 1, \
                   .b = 2, \
                 }, \ 
                 { \
                   .a = 3, \
                   .b = 8, \
                 }, \
                 { \
                   .a = 11, \
                   .b = 29, \
                }}

#define DEFAULT2 DEFAULT, DEFAULT
#define DEFAULT4 DEFAULT2, DEFAULT2
#define DEFAULT8 DEFAULT4, DEFAULT4
#define DEFAULT16 DEFAULT8, DEFAULT8

struct B b = {{DEFAULT16}};

我不明白这段代码:

  • 为什么最后一行需要双括号?
  • 此外,为什么我们需要在 DEFAULT 的定义中使用双括号。我明白了

                 {
                   .a = 3,
                   .b = 8,
                 }
    

是一个普通的结构初始化。但是第二对大括号似乎我将b 初始化为16 类型为struct A [3] 的对象的数组。为什么不简单地列出b 的值,就好像它是一个一维数组(与访问b[20] 的方式相同)?

  • 第三,现在我需要向struct B添加一个新字段,不知道如何修改初始化。新的struct B 应为:

                 struct B
                 {
                    int c[16];
                    struct A a[16][3];
                 }
    

编译器是 arm-none-eabi-gcc 4.7.2,没有强制执行任何 C 标准的标志。

【问题讨论】:

  • gcc -E编译你的代码,在预处理器完成他的工作后得到输出。我想输出会帮助你理解宏的作用。
  • @user2799037,谢谢,这通常是正确的方法。然而,这一次预处理的代码和我预期的一样。我仍然不知道它是如何工作的。
  • 内部数组元素的括号不是强制性的。所以你可以将你的struct B初始化为一维数组
  • @MadHatter,删除DEFAULTerror: field name not in record or union initializer 中的第一个和最后一个{
  • 另一方面,删除b = 中的一个大括号会导致error: field name not in record or union initializer。用-E 预处理的代码有4 个前大括号:{{{{ .a = 1, ...

标签: c struct initialization c-preprocessor


【解决方案1】:

如果我理解正确,

struct A 内的东西需要一个大括号,例如

struct A a = { .a = 1, .b = 2 };

二维数组需要两个大括号,例如

int array[2][2] = {
  { 1, 1 },
  { 1, 1 }
};

struct B 内的东西需要最后一个大括号。

最后,要将int c[16] 添加到struct B,您可以将sn-p 的最后一行替换为以下内容:

struct B b = {{0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},{DEFAULT16}};

或使用适当的宏替换以提高可读性。

【讨论】:

  • Edited ';'-s in。通过#define LQLQ {1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1} {LQLQ, {DEFAULT16}}; 解决了我的问题。现在我没有直接的问题,很难判断我是否完全理解语法。接受您的回答是有帮助的。谢谢!
猜你喜欢
  • 1970-01-01
  • 2011-07-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-07-09
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多