初始化C中的混合结构

时间:2016-09-05 16:22:13

标签: c

我有一个C结构说

typedef struct __X {
    char AA[10];
    int A;
    char BB[10];
    int B;
    ..
    ..
    ..
    char ZZ[10];
    int Z;
} _X;

如果int应初始化为0,char初始化为''空格,如何使用极少的代码初始化结构。

我知道的一个解决方案是:

memset(_X,0,sizeof(_X));

然后单独将AA,BB,CC ... ZZ设置为'',但这是一个漫长的过程,需要进行大量的代码更改。

有没有更简单的方法?

2 个答案:

答案 0 :(得分:1)

实现此目的的最简单方法是编写初始化函数:

void initialize(_X *x)
{
  memset(x, 0, sizeof(_X));

 x->AA[0] = ' ';
 x->BB[0] = ' ';
 // etc
 // etc
 x->ZZ[0] = ' ';
}

你不会比这更加微不足道。

编辑:如果您正在寻找用空格填充char数组,那么您需要memset它们,而不是将第一个char设置为空格。

答案 1 :(得分:0)

指定的初始值设定项

假设你想要字符串中的一个空格和数字中的零,那么使用C99指定的初始化程序将会像你可以合理地得到的那样紧凑:

_X x = { .AA = " ", .BB = " ", .CC = " ", …, .ZZ = " " };

是你可以逃脱的最低限度。如果每个字符串需要9个空格(为什么?),则将字符串文字更改为9个空格。所有未提及的元素(int成员)都被初始化为零。

如果您需要在许多地方进行相同的初始化,请考虑创建一个可在必要时使用的常量全局变量:

const _X x_default = { .AA = " ", .BB = " ", .CC = " ", …, .ZZ = " " };

然后使用:

_X other_x = x_default;

这不能用于初始化全局变量或文件范围变量,但是你不应该有很多变量(x_default是明显的例外)。您可以将此包装在一个函数中,该函数采用由赋值(_X *)初始化的void set_x(_X *xp) { *xp = x_default; }参数或者返回值(_X set_x(void) { return x_default; })的函数 - 选择权属于您自己。但初始化程序应尽可能少写出来。查看PTHREAD_MUTEX_INITIALIZER并考虑如何使用该想法。

如果由于某种原因你的编译器不支持旧的C标准(C99)并且只支持古老的C标准(C90),那么你必须完全写出初始化器:

_X x = { " ", 0, " ", 0, " ", 0, …, " ", 0 };

结构设计

由于其重复的内容,所示的结构是有问题的。应该是:

struct Y
{
    char name[10];
    int  number;
};

struct X
{
    struct Y letters[26];
};

或者那些东西。改变这需要大量的编辑,但很多处理将更加简单。有趣的是,初始化序列会变得更加嘈杂,但是从长远来看,你不需要将所有其他内容写出26次这一事实将会节省成本。

篡夺保留标识符

请注意,名称_X__X都是无条件保留的。 在您的代码中使用它们。除非你真的喜欢阅读细则,否则不要使用以下划线开头的名称。如果您喜欢精细打印,则§7.1.3C11(和C99)的保留标识符适用:

  
      
  • 所有以下划线和大写字母或其他字母开头的标识符   下划线总是保留用于任何用途。
  •   
  • 所有以下划线开头的标识符始终保留用作标识符   在普通名称和标签名称空间中都有文件范围。
  •