2015-10-12 2 views
4

В течение многих лет я инициализирую свои struct stat так:Как правильно инициализировать 'struct stat' с помощью C++ 11?

#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, а предупреждение означает, что я не инициализацию всех членов. Каков предпочтительный способ создания и инициализации struct stat в C++ 11?

+0

_ "Это из-за нового синтаксиса инициализатора C++ 11" _ Это? –

ответ

8

Использование

stat s{}; 

вместо этого и он будет делать свою работу без каких-либо предупреждений. Он называется value-initialization объекта. Хотя в вашем случае struct stat foo = {0}; должен выполнить aggregate initialization (при условии, что ваш struct stat - это aggregate), а остальные члены также должны быть инициализированы по значению, поэтому технически код правильный.

+0

Очень ценится. –

1

Если ваш компилятор старше и не поддерживает struct s{} синтаксиса, вы можете все еще быть в состоянии использовать синтаксис C99: struct stat s = { .st_dev = 0 }; В противном случае даже это, или если у вас есть, чтобы стереть один, memset(&s, 0, sizeof(struct stat)); всегда будут работать.

1

Возможно ли это из-за недоразумения {0}? Вы знаете, что 0 не фактически означает «установить все поля в ноль», правильно? Это означает, что «установить первое поле в ноль» ... и все остальные оставлены прихотью языка (который, как это бывает, будет ноль-инициализировать их в любом случае).

struct stat foo = {} более точно описывает ваше намерение, и я подозреваю, что он также позаботится о предупреждении.

Конечно, в настоящее время, вы можете быть абсолютно очистить письменно struct stat foo{};.

Смежные вопросы