3

例如,給定一個結構S:給定一個指向結構體的指針,我可以在一行中分配一個聚合初始化程序的結果嗎?

typedef struct { 
    int a, b; 
} S; 

...和這需要一個指向S,一種方法我可以指定它的聚集體初始化的值都在一個行?這是我現有的解決方案,它使用一個臨時的:

void init_s(S* s) { 
    S temp = { 1, 2 }; 
    *s = temp; 
} 

我正在使用C11。


對於非常罕見的超級學究誰不明白我的問題,因爲在某種程度上「聚合初始化」不會在這裏適用,因爲LHS沒有宣佈一個新的對象,我的意思是「聚集物與花括號和東西的初始化類似的語法「。

+1

是:'* S =(S){1,2};'見C11 n1570,§6.5.2.5 *化合物文字*,第10段:例3:'drawline((struct point){。x = 1,.y = 1},(struct point){。x = 3,.y = 4});' –

+0

@IwillnotexistIdonotexist - 它[作品](https://godbolt.org/g/SFhL3z),謝謝!足夠好的答案:) – BeeOnRope

+0

'* s = ...'不是一個初始化程序。由於's'已經被聲明,你根本不能使用一個初始化器。上面的代碼不會**編譯。 – Olaf

回答

5

是的,則可以使用compound literals語法:

#include <stdio.h> 

typedef struct { 
    int a, b; 
} S; 

int main(void) { 
    S s; 
    S *p = &s; 

    *p = (S){1,2}; 

    printf("%d %d\n", p->a, p->b); 
    return 0; 
} 

Demo

+0

如果複合文字不打算修改,最好是「靜態常量」。否則可能會涉及兩個複製操作(取決於編譯器的智能程度)。 – Olaf

+0

至少對於這個玩具的例子來說,clang和gcc是正確的,爲複合文字賦值和明確指定字段的版本生成相同的[code](https://godbolt.org/g/HzNhgP)(和它們都足夠聰明,可以將兩個32位常量合併爲一個64位常量並一次賦值)。如果'a'和'b'是參數,'icc'會生成相同的代碼,但在常量情況下,它會以不同的方式生成:在它的'.rodata'節創建一個常量(S){1,2}對象負載。對於大量常量重複使用這可能是明智的,但在這裏似乎是錯誤的。 – BeeOnRope

相關問題