значение по умолчанию для члена структуры в C

84

Можно ли установить значения по умолчанию для некоторого члена структуры? Я пробовал следующее, но это вызвало синтаксическую ошибку:

Ошибки:

user1508893
источник
Вы можете создать функцию инициализатора для структуры.
sgarizvi 04
5
Не в C. Вы можете создать функцию, которая возвращает структуру с нужными вам значениями.
Vaughn Cato
Когда вы его создаете, вы можете инициализировать значения следующим образом: stackoverflow.com/questions/749180/default-values-in-ac-struct
Fantastic Mr Fox
Для структуры C ++ вы можете инициализировать данные по умолчанию в конструкторе
Zac

Ответы:

126

Структура - это тип данных . Вы не присваиваете значения типу данных. Вы присваиваете значения экземплярам / объектам типов данных.
Так что нет, это невозможно в C.

Вместо этого вы можете написать функцию, которая выполняет инициализацию экземпляра структуры.

В качестве альтернативы вы можете сделать:

И затем всегда инициализируйте свои новые экземпляры как:

Алок Сохранить
источник
3
Если у меня есть глобальный массив: 'MyStruct arr [MAX_SIXE];', как можно использовать эту функцию? (ПРИМЕЧАНИЕ: у меня не может быть функции init (), которая проходила бы через всех членов и устанавливала флаг)
user1508893 05
10
MyStruct_default следует объявить как const.
Lundin
1
Спасибо за Ваш ответ. Закончил создание песочницы для кода, чтобы протестировать его в сети, сначала возникли проблемы с подключением всего, надеюсь, это поможет кому-то другому: ideone.com/knQ7xS
HoldOffHunger
52

ты не можешь сделать это таким образом

Вместо этого используйте следующее

Вы можете использовать макрос для определения и инициализации ваших экземпляров. это упростит вам задачу каждый раз, когда вы захотите определить новый экземпляр и инициализировать его.

и в вашем коде, когда вам нужно определить новый экземпляр с типом сотрудника, вы просто вызываете этот макрос, например:

МОХАМЕД
источник
1
Не кажется хорошим, если вы хотите, чтобы параметр не соответствовал требованиям.
18

Я согласен с Алсом в том, что вы не можете инициализировать во время определения структуры в C. Но вы можете инициализировать структуру во время создания экземпляра, как показано ниже.

В C,

в C ++ можно указать прямое значение в определении структуры, показанной ниже

Чираг Десаи
источник
13

Ты можешь сделать:

И тогда вам просто нужно не забыть выполнить инициализацию по умолчанию, когда вы объявляете новую переменную сотрудника:

В качестве альтернативы вы всегда можете просто создать структуру своего сотрудника с помощью фабричной функции.

Донни
источник
8

Если вы используете, gccвы можете предоставить designated initializersсоздание объекта.

Или просто используйте как инициализацию массива.

employee e = {0 , "none"};

Омкант
источник
1
Я видел, что в некотором коде также используются двоеточия для обозначенных инициализаторов, подробнее в этом вопросе: stackoverflow.com/questions/1601201/…
sdaau
7

Создайте структуру по умолчанию, как упоминалось в других ответах:

Тем не менее, приведенный выше код не будет работать в заголовочном файле - вы получите сообщение об ошибке: multiple definition of 'MyStruct_default'. Чтобы решить эту проблему, используйте externвместо этого в заголовочном файле:

И в cфайле:

Надеюсь, это поможет любому, у кого возникнут проблемы с файлом заголовка.

Дэвид Калланан
источник
Комментарий несколько лет спустя: вероятно, будет больше смысла, если вы можете сделать это прямо в файле заголовка.
Дэвид Калланан,
5

Более того, чтобы добавить существующие ответы, вы можете использовать макрос, который скрывает инициализатор структуры:

Затем в вашем коде:

Богдан Александру
источник
3

Вы можете реализовать функцию инициализации:

битовая маска
источник
Обратите внимание, что объект переменной структуры C e (const или нет) исчезнет, ​​когда блок, в котором он определен, завершится. Если это указатель, это вызовет проблему с висячим указателем. Таким образом, это не лучшее решение, если тип возвращаемого значения - указатель. Наилучший способ - иметь статический объект глобальной переменной структуры со значениями по умолчанию с использованием инициализаторов структуры C и использовать функции set и get для переменной, чтобы изменять ее значения во время выполнения программы. Или передайте объект переменной локальной структуры в функцию набора в качестве параметра и измените значения его свойств внутри функции набора.
ecle 05
2
Извините, но это неправильно @ecle. Возвращаемое значение - голая структура, а не указатель. Он будет скопирован, а не возвращен по ссылке. Честно говоря, компилятор, вероятно, изрядно оптимизирует его.
Bitmask
@bismask Не поймите меня неправильно .. Я уже упоминал, возвращает ли функция указатель, если это указатель . Возможно, вы прокомментировали мой предыдущий комментарий до моего недавнего редактирования.
ecle 07
2

Вы можете использовать некоторую функцию для инициализации структуры следующим образом:

РЕДАКТИРОВАТЬ:

Адил Ахмед
источник
2
А что, если я хочу иметь глобальный массив структур, как вы предлагаете вызвать GetMyStruct ()?
user1508893 05
Разве GetMyStruct не должен использовать malloc?
Дмитрий
2

Вы можете использовать комбинацию функций препроцессора C с varargs , составными литералами и назначенными инициализаторами для максимального удобства:

Максим Кулькин
источник
1

Если вы используете эту структуру только один раз , то есть создаете глобальную / статическую переменную, вы можете удалить typedefи сразу же инициализировать эту переменную:

После этого вы можете использовать employeeв своем коде.

HaxtraZ
источник
0

Функция инициализации для структуры - хороший способ предоставить ей значения по умолчанию:

Или даже короче:

Израиль Унтерман
источник
Если у меня есть глобальный массив: 'MyStruct arr [MAX_SIXE];', как можно использовать эту функцию? (ПРИМЕЧАНИЕ: у меня не может быть функции init (), которая проходила бы через всех участников и устанавливала флаг)
user1508893 05
0

Другой подход к значениям по умолчанию. Сделайте функцию инициализации того же типа, что и структура. Этот подход очень полезен при разделении большого кода на отдельные файлы.

Земледелец
источник
0

Вы можете создать для него функцию:

Джозеф Пена
источник
0

Другой подход, если структура позволяет это, - использовать #define со значениями по умолчанию внутри:

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

CSharpino
источник
-4

Я думаю, что это можно сделать следующим образом,

Шибу Дж
источник
На самом деле это битовое поле, а не значение по умолчанию. en.cppreference.com/w/cpp/language/bit_field
Бруно Александр Роза