C (или C ++?) Синтаксис: STRUCTTYPE varname = {0}; - PullRequest
4 голосов
/ 04 февраля 2011

Обычно можно объявить / выделить структуру в стеке с помощью:

STRUCTTYPE varname;

Что означает этот синтаксис в C (или это только C ++, или, возможно, специфично для VC ++)?

STRUCTTYPE varname = {0};

где STRUCTTYPE - это имя типа Stuct, например, RECT или что-то еще.Этот код компилируется, и кажется, что он просто обнуляет все байты структуры, но я хотел бы знать наверняка, есть ли у кого-нибудь ссылка.Кроме того, есть ли название для этой конструкции?

Ответы [ 2 ]

8 голосов
/ 04 февраля 2011

Это агрегатная инициализация, которая является допустимой C и действительной C ++.

C ++ дополнительно позволяет опустить все инициализаторы (например, ноль), но для обоих языков объекты без инициализатора инициализируются значением илиинициализированный нулями:

// C++ code:
struct A {
  int n;
  std::string s;
  double f;
};

A a = {};  // This is the same as = {0, std::string(), 0.0}; with the
// caveat that the default constructor is used instead of a temporary
// then copy construction.

// C does not have constructors, of course, and zero-initializes for
// any unspecified initializer.  (Zero-initialization and value-
// initialization are identical in C++ for types with trivial ctors.)
3 голосов
/ 04 февраля 2011

В C инициализатор {0} действителен для инициализации переменной any типа any со всеми нулевыми значениями.В C99 это также позволяет вам присваивать"ноль" любому изменяемому lvalue любого типа с использованием составного литерального синтаксиса:

type foo;
/* ... */
foo = (type){0};

К сожалению, некоторые компиляторы будут предупреждать вас о наличиинеправильное число »фигурных скобок вокруг инициализатора, если тип является базовым типом (например, int x = {0};) или вложенным типом структуры / массива (например, struct { int i[2]; } x = {0};).Я бы посчитал такие предупреждения вредными и отключил бы их.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...