繁体   English   中英

结构初始化C / C ++编程语言?

[英]Struct initialization of the C/C++ programming language?

我可以使用代码进行struct初始化:

struct struct_type_id struct_name_id = { value1, value2, value3 };

但不能用:

struct struct_type_id struct_name_id;
struct_name_id = { value1, value2, value3 };

为什么我可以用前者来做,但是后者不能用gcc,g ++,vc2008,vc6?换句话说,为什么c / c ++编程语言不支持这种语法?

谢谢。

第一个语句创建一个初始化为给定值的变量,即这些值构建在内存中并直接存储在该变量地址中的程序可执行文件中(对于全局变量)或准备好进行内存复制(对于堆栈变量)。

第二个块的第二个声明非常不同。 虽然看起来很相似,但它是一个赋值表达式。 这意味着equals运算符的RHS是一个被计算的表达式(独立于LHS中的=),然后传递给=运算符。 没有适当的背景, {...}没有任何意义。

在C99中,您可以这样做:

struct_name_id = (struct struct_type_id){ value1, value2, value3 };

现在,equals运算符的RHS是一个有效的表达式,因为编译器有适当的上下文来知道{...}

在C ++ 11中,语法是:

struct_name_id = struct_type_id{ value1, value2, value3 };

我不知道为什么C最初不支持某种语法来使用类似初始化列表的东西来“重新初始化”一个结构 - 有时我会发现它很方便。 正如Juliano所提到的 ,C99(和C ++ 0x)已将其修复到一定程度,但我经常不得不坚持使用C90。 当我想做类似的事情时,我有时会做以下事情:

struct foo const init_foo = { 1, 2, 3};
struct foo myFoo;

// ....

myFoo = init_foo;  // reinitialize myFoo

你只需要像这样强制转换值:

struct_name_id = (struct struct_type_id){ value1, value2, value3 };

这对你有用吗?

typedef struct name_id {int value1; int value2; int value3;} NAME_ID;
name_id mynameid = {0,1,2};

我遇到了类似的问题,解决方法是我试图在函数外部初始化结构(不使用初始化器语法,但使用obj.member = VALUE;表示法)。 这是一个相关的问题,所以发布在这里,希望有同样问题的人在这里登陆。

暂无
暂无

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

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