簡體   English   中英

使用復合文字初始化指向結構的指針

[英]Initialize pointer to a struct with a compound literal

我是C的新手,我正在嘗試理解復合文字的語法。 我的問題類似於在C中初始化指向復合文字的指針,但我認為不能回答它。 如果有一個結構和一個類型定義為結構的指針,如下所示:

typedef struct thing *thing_t;
struct thing
{
    int id;
    char *name;
};

然后我可以像這樣創建一個thing_t

thing_t instance = & (struct thing) {
    .id = 1,
    .name = "A"
};

我想知道是否有一種方法來初始化thing_t而不明確引用struct thing ,例如我試着看看它是否是有效的語法:

thing_t instance = (* thing_t) {
    .id = 1,
    .name = "A"
};

但編譯錯誤。 編譯器必須“知道” thing_t類型包含指向某個thing的指針,但是是否存在允許在此上下文中可互換地使用這兩個的語法?

(我沒有特定的用例,我只是想了解類型和結構是如何相關的)。

我想知道是否有一種方法來初始化thing_t而不明確引用struct thing ,例如我試着看看它是否是有效的語法:

 thing_t instance = (* thing_t) { .id = 1, .name = "A" }; 

但編譯錯誤。 編譯器必須“知道”thing_t類型包含指向事物的指針,

是的,確實如此,雖然定義一個隱藏指針性質的類型別名是不好的形式,正如你所做的那樣,並且使用一個名稱不會以某種方式提供關於它的線索這樣做的形式特別糟糕。

但是有沒有語法允許在這種情況下互換使用兩個?

復合文字的語法包括括號類型說明符。 這不是演員,它是文字本身的一部分。 你不能沒有它。 但是,如果你想避免使用struct ,那么你可以通過更改類型別名來一舉兩得,以便它描述結構類型本身,而不是指向一個結構:

typedef struct thing thing_t;
struct thing {
    int id;
    char *name;
};
thing_t *instance = & (thing_t) {
    .id = 1,
    .name = "A"
};

它不僅有效,而且比你的建議更清晰。 例如,使用&運算符與變量instance的清除聲明作為指針匹配。

暫無
暫無

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

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