我有一个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设置为'',但这是一个漫长的过程,需要进行大量的代码更改。
有没有更简单的方法?
答案 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)的保留标识符适用:
- 所有以下划线和大写字母或其他字母开头的标识符 下划线总是保留用于任何用途。
- 所有以下划线开头的标识符始终保留用作标识符 在普通名称和标签名称空间中都有文件范围。