簡體   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