簡體   English   中英

在C中初始化一個結構

[英]Init a struct in C

我有一個與C中的結構初始化有關的問題。我有一個結構:

struct TestStruct
{
u8 status;
u8 flag1;
u8 flag2;
};

我想要一個泛型函數/宏來初始化這個結構並設置一個參數的值,例如status = 1,簡單的方法是:

TestStruct t = {};
t.status = 1;

但是,通過執行此操作,我已將狀態值設置兩次,在init函數中首先設置為0,然后將其設置為1(優化沒有幫助?)。
(請不要告訴我t = {1,0,0}我正在尋找通用方法)
我正在考慮init函數中的一個宏,如:

#define INIT_TESTSTRUCT (param, value) \
{ .status=0, .flag1=0, .flag2=0, .param=value }
TestStruct t = INIT_TESTSTRUCT(status, 0);

但是,編譯器給出錯誤“初始化字段被覆蓋”,因為我已經設置了狀態值兩次。

請幫助指出如何改變宏來實現我想要的,非常感謝。

#define INIT_TESTSTRUCT(param, value) \
    { .param=(value) }
TestStruct t = INIT_TESTSTRUCT(status, 0);

應該這樣做。 然后將該變量添加到.data段中 - 因為它是一個初始化的 - 並且所有未明確提及的字段由編譯器(而不是鏈接器或加載器)設置為0。

你在錯誤的地方有一個空間:

#define INIT_TESTSTRUCT(param, value) \
{ .status=0, .flag1=0, .flag2=0, .param=(value) }

應該這樣做。

(宏定義必須緊跟在宏名之后。否則解析器將其作為沒有參數的宏並將其擴展為(param, value) ...etc...在你的情況下,這顯然是一個語法錯誤。

另外請注意,它通常是一個好主意,把()圍在replacment文本參數,以避免出現語法混亂。

好吧,首先

TestStruct t = {};

在C中是非法的。如果在您的情況下編譯,它必須是非標准的編譯器擴展。 你可以達到同樣的效果

TestStruct t = { 0 };

這在C中是合法的。它將整個結構中的所有字段設置為零。

其次,即使使用指定的初始化器,C語言也遵循傳統的“全有或全無”初始化方法:如果只初始化聚合的一個字段,則所有其他字段都隱式初始化為零。

這意味着在您的情況下,您所要做的就是

TestStruct t = { .status = 1 };

初始化整個結構。 status字段將設置為1 ,而所有其他字段將設置為零。

所以,你的宏可以實現為

#define INIT_TESTSTRUCT(param, value) { .param = value }
TestStruct t = INIT_TESTSTRUCT(status, 1);

沒有必要將所有其他字段顯式設置為零 - 它將自行發生。

暫無
暫無

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

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