[英]How to initialise a C struct without generating warnings when compiling with the GCC “-Wextra” option?
#include <stdio.h>
#include <string.h>
typedef struct STest
{
unsigned int uiRoll;
unsigned short usiVal;
} TTest;
int main()
{
TTest oTest = {0}; /* Initialize the Values with 0 */
printf( "The values are: %d, %d\n", oTest.uiRoll, oTest.usiVal );
return 0;
}
觀察:
gcc -Wextra -oa aa.cpp
編譯 warning: missing initializer for member STest::usiVal
我該如何初始化結構? 所以沒有警告信息。
你為什么不初始化這兩個成員?
TTest oTest = {0, 0};
或者,可能更好:
TTest oTest = { .uiRoll = 0, .usiVal = 0};
(這假設您確實正在編寫C代碼,應使用gcc
並使用.c
擴展名保存。如果將該代碼保存在擴展名為.cpp
的文件中, gcc
將切換到C ++模式,並失敗在第二個版本。)
另一種選擇:將編譯器升級到GCC> = 4.7.2(可能是普通的4.7.0就足夠了)。 該警告已被刪除,您可以使用代碼中的簡短表單。
甚至:
TTest oTest;
memset(&oTest, 0, sizeof(oTest));
我沒有收到警告。 你是怎么嘗試使用memset的?
這種表示法是最便攜/正確的,可以初始化結構:
#include <stdio.h>
#include <string.h>
typedef struct STest
{
unsigned int uiRoll;
unsigned short usiVal;
} TTest;
int main()
{
/* Static declaration causes structure member's to be zeroed at instanciation */
static const TTest zeroed_struct;
/* Structure assignement is then safely used */
TTest oTest = zeroed_struct;
printf( "The values are: %d, %d\n", oTest.uiRoll, oTest.usiVal );
return (0);
}
聲明靜態 TTest
結構會導致編譯器自動將所有結構字段設置為零。 然后,您可以安全地使用賦值運算符將結構成員的另一個實例初始化為零。
在我看來,像你一樣使用通用零初始化器是正確的。 盡管如此,我在GCC bugtracker上找到了這篇有趣的帖子,這可以解釋為什么會對你的GCC
版本發出警告,可能是4.4
版本: http : //gcc.gnu.org/bugzilla/show_bug.cgi?id = 53119 。
除了在這種情況下GCC實際上可能是正確的事實之外,禁用警告的一般經驗法則是為控制特定情況的警告消息的發出的選項添加no-
前綴。 例如,如果您閱讀gcc的手冊頁,它具有以下內容:
聚合具有初始化程序,該初始化程序不會初始化所有成員。 此警告可由-Wmissing-field-initializers獨立控制。
因此,為了禁用此選項,您必須將-Wno-missing-field-initializers
傳遞給GCC。
有趣的是,GCC 4.2.1發出此警告,而GCC 4.7.2則沒有,即使明確啟用了該警告。 經過一些實驗后,似乎如果指定一個0
,則不會給出警告。 但是,如果指定兩個或多個字段但不是全部字段,則會出現警告。
希望能幫助到你。 祝好運!
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.