簡體   English   中英

如何使用C ++ 11正確初始化'struct stat'?

[英]How do I properly initialize 'struct stat' using C++11?

多年來我一直在初始化我的struct stat如下所示:

#include <sys/stat.h>
struct stat foo = {0};

具體來說, {0}將所有字段設置為零,相當於memset (&foo, NULL, sizeof foo); 現在使用C ++ 11,這已經開始產生警告:

foo.cpp:2:19: warning: missing field 'st_mode' initializer [-Wmissing-field-initializers]
  struct stat s = {0};
                    ^

這是因為C ++ 11的新初始化器語法,警告暗示我沒有初始化所有成員。 在C ++ 11中實例化和初始化struct stat的首選方法是什么?

采用

stat s{};

相反,它將在沒有任何警告的情況下完成工作。 它被稱為對象的值初始化 雖然在你的情況下struct stat foo = {0}; 應該執行聚合初始化 (假設你的struct stat是一個聚合 ),其余的成員也應該進行值初始化,所以從技術上講,代碼是正確的。

如果您的編譯器較舊且不支持struct s{}語法,您仍可以使用C99語法: struct stat s = { .st_dev = 0 }; 甚至失敗,或者你必須擦除一個, memset( &s, 0, sizeof(struct stat) ); 永遠都會有用。

這可能源於一個誤解{0}的案例嗎? 你知道0 實際上並不意味着“將所有字段設置為零”,對吧? 這意味着“將第一個字段設置為零”......所有其他字段都留給語言的一時興起(正如它所發生的那樣,無論如何都會將它們初始化為零)。

struct stat foo = {}會更准確地描述你的意圖,我懷疑它也會處理警告。

當然,現在,通過編寫struct stat foo{};可以非常清楚struct stat foo{};

暫無
暫無

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

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