繁体   English   中英

在C中初始化一个结构

[英]Init a struct in C

我有一个与C中的结构初始化有关的问题。我有一个结构:

struct TestStruct
{
u8 status;
u8 flag1;
u8 flag2;
};

我想要一个泛型函数/宏来初始化这个结构并设置一个参数的值,例如status = 1,简单的方法是:

TestStruct t = {};
t.status = 1;

但是,通过执行此操作,我已将状态值设置两次,在init函数中首先设置为0,然后将其设置为1(优化没有帮助?)。
(请不要告诉我t = {1,0,0}我正在寻找通用方法)
我正在考虑init函数中的一个宏,如:

#define INIT_TESTSTRUCT (param, value) \
{ .status=0, .flag1=0, .flag2=0, .param=value }
TestStruct t = INIT_TESTSTRUCT(status, 0);

但是,编译器给出错误“初始化字段被覆盖”,因为我已经设置了状态值两次。

请帮助指出如何改变宏来实现我想要的,非常感谢。

#define INIT_TESTSTRUCT(param, value) \
    { .param=(value) }
TestStruct t = INIT_TESTSTRUCT(status, 0);

应该这样做。 然后将该变量添加到.data段中 - 因为它是一个初始化的 - 并且所有未明确提及的字段由编译器(而不是链接器或加载器)设置为0。

你在错误的地方有一个空间:

#define INIT_TESTSTRUCT(param, value) \
{ .status=0, .flag1=0, .flag2=0, .param=(value) }

应该这样做。

(宏定义必须紧跟在宏名之后。否则解析器将其作为没有参数的宏并将其扩展为(param, value) ...etc...在你的情况下,这显然是一个语法错误。

另外请注意,它通常是一个好主意,把()围在replacment文本参数,以避免出现语法混乱。

好吧,首先

TestStruct t = {};

在C中是非法的。如果在您的情况下编译,它必须是非标准的编译器扩展。 你可以达到同样的效果

TestStruct t = { 0 };

这在C中是合法的。它将整个结构中的所有字段设置为零。

其次,即使使用指定的初始化器,C语言也遵循传统的“全有或全无”初始化方法:如果只初始化聚合的一个字段,则所有其他字段都隐式初始化为零。

这意味着在您的情况下,您所要做的就是

TestStruct t = { .status = 1 };

初始化整个结构。 status字段将设置为1 ,而所有其他字段将设置为零。

所以,你的宏可以实现为

#define INIT_TESTSTRUCT(param, value) { .param = value }
TestStruct t = INIT_TESTSTRUCT(status, 1);

没有必要将所有其他字段显式设置为零 - 它将自行发生。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM