Структурировать инициализацию языка программирования C / C ++? - PullRequest
12 голосов
/ 10 ноября 2009

Я мог бы сделать инициализацию структуры с кодом:

struct struct_type_id struct_name_id = { value1, value2, value3 };

но не может с:

struct struct_type_id struct_name_id;
struct_name_id = { value1, value2, value3 };

почему я мог сделать это с первым, но не мог с последним с gcc, g ++, vc2008, vc6? Другими словами, почему язык программирования c / c ++ не поддерживает этот синтаксис?

спасибо.

Ответы [ 5 ]

22 голосов
/ 10 ноября 2009

Первый оператор создает переменную, инициализированную для заданных значений, то есть эти значения встроены в память и сохраняются непосредственно в исполняемом файле программы по этому адресу переменной (для глобальных переменных) или готовы для копирования в память (для переменных стека).

Второй оператор второго блока сильно отличается. Хотя это выглядит похоже, это выражение присваивания. Это означает, что RHS оператора equals является выражением, которое оценивается (независимо от того, что находится в LHS of =), а затем передается оператору =. Без надлежащего контекста {...} не имеет никакого значения.

В C99 вы можете сделать это:

struct_name_id = (struct struct_type_id){ value1, value2, value3 };

Теперь RHS оператора equals является допустимым выражением, поскольку компилятор должен знать, что находится в {...}.

В C ++ 11 синтаксис:

struct_name_id = struct_type_id{ value1, value2, value3 };
4 голосов
/ 10 ноября 2009

Я не знаю, почему C изначально не поддерживал некоторый синтаксис для «повторной инициализации» структуры с использованием чего-то вроде списка инициализатора - бывают моменты, когда я бы посчитал это удобным. Как упомянул Джулиано , C99 (и C ++ 0x) исправили это в определенной степени, но мне часто приходится придерживаться C90. Когда я хочу сделать что-то подобное, я иногда делаю следующее:

struct foo const init_foo = { 1, 2, 3};
struct foo myFoo;

// ....

myFoo = init_foo;  // reinitialize myFoo
2 голосов
/ 10 ноября 2009

Вам просто нужно привести значения так:

struct_name_id = (struct struct_type_id){ value1, value2, value3 };
0 голосов
/ 19 декабря 2009

Я столкнулся с подобной проблемой, и решение этой проблемы состояло в том, что я пытался инициализировать структуру вне функции (не используя синтаксис инициализатора, а с obj.member = VALUE; нотация). Это связанная с этим проблема, поэтому постить здесь, надеясь, что кто-то с таким же вопросом попал сюда.

0 голосов
/ 10 ноября 2009

Будет ли это работать для вас?

typedef struct name_id {int value1; int value2; int value3;} NAME_ID;
name_id mynameid = {0,1,2};
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...