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


84

Чи можна встановити значення за замовчуванням для якогось елемента структури? Я спробував наступне, але це призведе до синтаксичної помилки:

Помилки:


Ви можете створити функцію ініціалізації для структури.
sgarizvi

5
Не в C. Ви можете створити функцію, яка повертає структуру зі значеннями, які ви хочете.
Вон Катон

Створюючи його, ви можете ініціалізувати такі значення: stackoverflow.com/questions/749180/default-values-in-ac-struct
Fantastic Mr Fox

Для структури C ++ ви можете ініціювати дані за замовчуванням у конструкторі
Zac

Відповіді:


126

Структура - це тип даних . Ви не надаєте значення типу даних. Ви надаєте значення екземплярам / об'єктам типів даних.
Так що ні, це неможливо у C.

Натомість ви можете написати функцію, яка виконує ініціалізацію для екземпляра структури.

Крім того, ви можете зробити:

А потім завжди ініціалізуйте свої нові екземпляри як:


3
Якщо у мене є глобальний масив: 'MyStruct arr [MAX_SIXE];', як можна використовувати функцію? (ПРИМІТКА: Я не можу мати функцію init (), яка проходила б усіх членів та встановлювала прапор)
user1508893

10
MyStruct_default слід оголосити як const.
Лундін,

1
Дякую за вашу відповідь. Закінчився виготовляти пісочницю коду для тестування в Інтернеті, спочатку виникли проблеми з підключенням всього, сподіваюся, це допомагає комусь іншому: ideone.com/knQ7xS
HoldOffHunger

52

ви не можете зробити це таким чином

Замість цього використовуйте наступне

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

і у вашому коді, коли вам потрібно визначити новий екземпляр із типом співробітника, ви просто викликаєте цей макрос, як:


1
Не здається добре, якщо ви хочете, щоб перехід до параметра не відповідав вимогам.

18

Я погоджуюсь з Алсом, що ви не можете ініціалізувати під час визначення структури в 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

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


Відзначено, що змінний об'єкт С структури e (const чи ні) зникне при виході блоку, в якому він визначений. Якщо це вказівник, це спричинить проблему звисаючого вказівника. Отже, це не є гарним рішенням, якщо тип повернення є покажчиком. Найкращий спосіб - це статичний глобальний об’єкт змінної struct зі значеннями за замовчуванням за допомогою ініціалізаторів C struct та використовувати функції і набір і отримати змінну для зміни її значень під час роботи програми. Або передайте об’єкт змінної локальної структури заданій функції як параметр і змініть значення його властивостей всередині заданої функції.
ecle

2
Вибачте, але це просто неправильно @ecle. Повернене значення є голою структурою, а не покажчиком. Він буде скопійований, а не повернутий за посиланням. Чесно кажучи, компілятор, ймовірно, оптимізує це.
bitmask

@bismask Не розумійте мене неправильно .. Я вже згадував, якщо функція повертає покажчик, якщо це покажчик . Можливо, ви коментували мій попередній коментар до мого недавнього редагування.
ecle

2

Ви можете використовувати якусь функцію для ініціалізації структури таким чином,

РЕДАГУВАТИ:


2
Ну, а якщо я хочу мати глобальний масив структур, як ви пропонуєте викликати GetMyStruct ()?
user1508893

Чи не слід GetMyStruct використовувати malloc?
Дмитро

2

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


1

Якщо ви використовуєте цю структуру лише один раз , тобто створюєте глобальну / статичну змінну, ви можете typedefмиттєво видалити та ініціалізувати цю змінну:

Потім ви можете використовувати employeeу своєму коді після цього.


0

Функція ініціалізації структури є хорошим способом надати їй значення за замовчуванням:

Або навіть коротше:


Якщо у мене є глобальний масив: 'MyStruct arr [MAX_SIXE];', як можна використовувати функцію? (ПРИМІТКА: Я не можу мати функцію init (), яка проходила б усіх членів та встановлювала прапор)
user1508893

0

Інший підхід до значень за замовчуванням. Зробіть функцію ініціалізації з тим самим типом, що і структура. Цей підхід дуже корисний при розбитті великого коду на окремі файли.


0

Ви можете створити для нього функцію:


0

Інший підхід, якщо структура дозволяє це, полягає у використанні #define із значеннями за замовчуванням всередині:

Використання:


Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.