2009-11-10 54 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;表示)。這是一個相關的問題,所以張貼在這裏,希望有同樣問題的人登陸這裏。