2009-11-10 77 views
10

我可以做结构的初始化代码为:C/C++编程语言的结构体初始化?

​​

但无法:

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

为什么我可以同前做到这一点,但不能与后者用gcc,G ++,VC2008 ,vc6?换句话说,为什么c/C++编程语言不支持这种语法?

感谢。

+3

我在哪里可以了解有关此C/C++编程语言的更多信息?它有一个网页吗? – 2014-05-28 02:33:24

回答

22

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

第二个区块的第二个陈述非常不同。虽然看起来相似,但它是一个分配表达式。这意味着等号运算符的RHS是一个被评估的表达式(独立于=中的LHS),然后传递给=运算符。没有适当的上下文,{...}没有任何意义。

在C99中,你可以这样做:

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

现在的平等经营的RHS是一个有效的表达,因为是编译器知道什么是{...}适当的范围内。

在C++ 11,语法是:

struct_name_id = struct_type_id{ value1, value2, value3 }; 
+0

@Juliano:C89也支持这种符合gcc的类型转换语法。 – Jichao 2009-11-10 03:29:36

+2

@jcyang:GCC可能允许使用该语法,但它不是C89/C90(这是GCC扩展)。例如,MSVC,Digital Mars和Comeau不支持(除非您在Comeau中启用C99支持)支持该语法。 – 2009-11-10 05:41:21

+0

@michael:但我使用了开关--std = c89 – Jichao 2009-11-10 13:53:14

2

你只需要转换值,例如:

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

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

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

// .... 

myFoo = init_foo; // reinitialize myFoo 
0

这个工作适合你吗?

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

@FractalSpace:它无法工作。它只是为结构name_id定义一个别名,但不要改变任何其他的东西。 – Jichao 2009-11-10 03:32:58

0

我面临类似的问题,并且将溶液于是,我试图初始化的功能以外的结构(不使用初始化语法,但与obj.member = VALUE;表示)。这是一个相关的问题,所以张贴在这里,希望有同样问题的人登陆这里。