簡體   English   中英

在沒有賦值的情況下初始化struct?

[英]Initialize struct without an assignment?

我無法在互聯網上找到答案,所以這是我的問題:我可以定義一個結構實例而不將其分配給C中的本地或全局變量嗎? 例如:

struct A {
  int b;
}

struct A foo() {
  return struct A { .b = 42 };
}

如果這不可能:為什么?

是的,您可以在C99及更高版本中使用復合文字。

return (struct A) { .b = 42 };

你甚至可以指向他們:

struct A *a = &(struct A) { .b = 42 };
a->b = 43;

這些文字比字符串文字“更好”,因為它們是可寫的。 當且僅當在文字類型中包含const ,編譯器才可以對它們進行匯集。

是的C99為此提供了復合文字( 請參見實時 ):

return (struct A) {  42 } ;

C99標准6.5.2.5草案中涵蓋了復合文字,並說:

后綴表達式由帶括號的類型名稱后跟括號括起的初始值設定項列表組成,是一個復合文字。 它提供了一個未命名的對象,其值由初始化列表給出。 84)

和:

復合文字的值是初始化列表初始化的未命名對象的值。 如果復合文字出現在函數體外,則該對象具有靜態存儲持續時間; 否則,它具有與封閉塊相關的自動存儲持續時間。

並提供了幾個例子,包括:

示例3具有指定的初始化器可以與復合文字組合。 使用復合文字創建的結構對象可以傳遞給函數,而不依賴於成員順序:

drawline((struct point){.x=1, .y=1}, (struct point){.x=3, .y=4});

gcc在它的擴展部分也有一個很好的文檔 ,因為它支持C99以外的這個功能以及clang

是的,從C99開始就有可能。 這是復合文字。

你的語法仍然錯誤。 使用:

(struct A){.b=42}

要么

(struct A){42}

但是,如果無關緊要,請選擇恆定的文字:

(const struct A){.b=42}

所有常量文字都受常量池的影響(包括由於歷史原因而具有char[]類型的字符串文字)。
任何函數外的常量復合文字和復合文字都有靜態存儲持續時間,
其余的都有自動存儲持續時間(注意返回一個指針,每次都必須初始化)。

總之,盡可能選擇常量文字。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM