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


84

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

Ошибки:


Вы можете создать функцию инициализатора для структуры.
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в своем коде.


0

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

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


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

0

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


0

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


0

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

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


Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.