Я хочу инициализировать элемент структуры, разделить в декларации и инициализации. Вот что у меня есть:
typedef struct MY_TYPE {
bool flag;
short int value;
double stuff;
} MY_TYPE;
void function(void) {
MY_TYPE a;
...
a = { true, 15, 0.123 }
}
Это способ объявить и инициализировать локальную переменную MY_TYPE
в соответствии со стандартами языка программирования C (C89, C90, C99, C11 и т. Д.)? Или есть что-нибудь лучше или хотя бы работает?
Обновление У меня был статический элемент инициализации, в котором я устанавливал каждый подэлемент в соответствии со своими потребностями.
c
struct
initialization
пресмыкаться
источник
источник
Ответы:
В (ANSI) C99 вы можете использовать назначенный инициализатор для инициализации структуры:
Редактировать: другие члены инициализируются как ноль: «пропущенные члены поля неявно инициализируются так же, как объекты, которые имеют статическую продолжительность хранения». ( https://gcc.gnu.org/onlinedocs/gcc/Designated-Inits.html )
источник
Вы можете сделать это с составным литералом . Согласно этой странице, он работает в C99 (который также считается ANSI C ).
Обозначения в инициализаторах являются необязательными; Вы также можете написать:
источник
Я вижу, что вы уже получили ответ об ANSI C 99, поэтому я расскажу о ANSI C 89. ANSI C 89 позволяет вам инициализировать структуру следующим образом:
Важно помнить, что в тот момент, когда вы инициализируете хотя бы один объект / переменную в структуре, все остальные переменные будут инициализированы значением по умолчанию.
Если вы не инициализируете значения в своей структуре, все переменные будут содержать «мусорные значения».
Удачи!
источник
a = (MYTYPE){ true, 15, 0.123 };
будет хорошо в C99
источник
Вы почти получили это ...
Быстрый поиск по 'struct initialize c' показывает мне это
источник
Стандарт языка программирования C ISO / IEC 9899: 1999 (обычно известный как C99) позволяет использовать назначенный инициализатор для инициализации членов структуры или объединения следующим образом:
Он определен в
paragraph 7
разделе6.7.8 Initialization
стандарта ISO / IEC 9899: 1999 как:Обратите внимание, что
paragraph 9
в том же разделе говорится, что:Однако в реализации GNU GCC пропущенные члены инициализируются как нулевое или подобное нулю значение, соответствующее типу. Как указано в разделе 6.27 Назначенные инициализаторы документации GNU GCC:
Компилятор Microsoft Visual C ++ должен поддерживать назначенные инициализаторы с версии 2013, согласно официальному сообщению в блоге C ++ Conformance Roadmap . Пункт
Initializing unions and structs
из Инициализаторы статьи в MSDN визуальной документации студии предполагает , что неназванные члены инициализируются нулевыми, как соответствующие значения аналогично GNU GCC.Стандарт ISO / IEC 9899: 2011 (широко известный как C11), который заменил ISO / IEC 9899: 1999, сохраняет обозначенные инициализаторы в разделе
6.7.9 Initialization
. Это также сохраняетparagraph 9
без изменений.Новый стандарт ISO / IEC 9899: 2018 (обычно известный как C18), который заменил ISO / IEC 9899: 2011, сохраняет обозначенные инициализаторы в разделе
6.7.9 Initialization
. Также сохраняетсяparagraph 9
без изменений.источник
struct thing { union { char ch; int i; }; };
. Позднее стандарт гласит: «Если в списке, заключенном в фигурные скобки, меньше инициализаторов, чем элементов или членов агрегата, или меньше символов в строковом литерале, используемом для инициализации массива известного размера, чем элементов в массиве, остальная часть совокупности должна быть инициализирована неявно так же, как объекты, которые имеют статическую продолжительность хранения. "как сказал Рон Нуни:
Важно помнить: в тот момент, когда вы инициализируете хотя бы один объект / переменную в структуре, все остальные переменные будут инициализированы значением по умолчанию.
Если вы не инициализируете значения в своей структуре (т.е. если вы просто объявляете эту переменную), все
variable.members
будут содержать «мусорные значения», только если объявление является локальным!Если объявление является глобальным или статическим (как в этом случае), все неинициализированные
variable.members
будут автоматически инициализированы следующим образом:0
для целых чисел и с плавающей точкой'\0'
дляchar
(конечно, это так же, как0
иchar
целочисленный тип)NULL
для указателей.источник
источник
Если MS не обновилась до C99, MY_TYPE a = {true, 15,0.123};
источник
Я нашел другой способ инициализации структур.
Структура:
Инициализация:
Согласно документации GCC, этот синтаксис устарел с GCC 2.5 .
источник
Мне не понравился ни один из этих ответов, поэтому я сделал свой собственный. Я не знаю, является ли это ANSI C или нет, это просто GCC 4.2.1 в режиме по умолчанию. Я никогда не могу вспомнить скобки, поэтому я начинаю с подмножества моих данных и сражаюсь с сообщениями об ошибках компилятора, пока они не закроются. Читаемость является моим первым приоритетом.
Данные могут начинать жизнь как файл с разделителями табуляцией, который вы ищете и заменяете, чтобы преобразовать его во что-то другое. Да, это вещи Debian. Итак, одна внешняя пара {} (с указанием массива), затем другая пара для каждой структуры внутри. С запятыми между. Помещать вещи в заголовок не обязательно, но в моей структуре около 50 элементов, поэтому я хочу, чтобы они были в отдельном файле, чтобы не допустить путаницы в моем коде, и поэтому их легче заменить.
источник
Структура в C может быть объявлена и инициализирована следующим образом:
источник
Я прочитал документацию по Microsoft Visual Studio 2015 для инициализации составных типов , все формы инициализации с
{...}
там объясняются , но там не упоминается инициализация с помощью точки с именем '' указатель ''. Это не работает также.Глава C.7 стандарта 6.7.8 Инициализация объясняет возможность указателей, но, на мой взгляд, она не совсем понятна для сложных структур. Стандарт C99 в формате PDF .
На мой взгляд, может быть, лучше
= {0};
-initialization для всех статических данных. Это меньше усилий для машинного кода.Используйте макросы для инициализации, например
typedef MyStruct_t{ int x, int a, int b; } MyStruct; define INIT_MyStruct(A,B) { 0, A, B}
Макрос может быть адаптирован, его список аргументов может быть независимым от измененного содержимого структуры. Это правильно, если нужно инициализировать меньше элементов. Это также подходит для вложенной структуры. 3. Простая форма: инициализация в подпрограмме:
Эта подпрограмма выглядит как ObjectOriented в C. Используйте
thiz
, но и неthis
компилируйте ее с C ++!источник
Я искал хороший способ инициализации моей структуры, и я должен использовать ниже (C99). Это позволяет мне инициализировать либо одну структуру, либо массив структур так же, как обычные типы.
Это может быть использовано в коде как:
источник
jsmn_ts_default
, но остальные структуры инициализируются так, как если бы массив имел статическую продолжительность хранения, что означает, что члены инициализируются вNULL
и0
. Но если вы#define jsmn_ts_default (jsmn_ts){"default", sizeof "default", NULL, 0}
перейдете к нему, вы увидите, что только первый элемент массива инициализируется.int a[10] = {1};
только с 1-м элементом==1