wartość domyślna dla elementu członkowskiego struktury w C

84

Czy można ustawić wartości domyślne dla jakiegoś elementu członkowskiego struktury? Próbowałem następujących rzeczy, ale spowodowałoby to błąd składni:

Błędy:

user1508893
źródło
Możesz utworzyć funkcję inicjalizującą dla struktury.
sgarizvi
5
Nie w C. Możesz jednak stworzyć funkcję, która zwraca strukturę z wartościami, które chcesz.
Vaughn Cato,
Po utworzeniu możesz zainicjować wartości w ten sposób: stackoverflow.com/questions/749180/default-values-in-ac-struct
Fantastic Mr Fox
W przypadku struktury C ++ możesz zainicjować domyślne dane w konstruktorze
Zac

Odpowiedzi:

126

Struktura to typ danych . Nie nadajesz wartości typowi danych. Nadajesz wartości instancjom / obiektom typów danych.
Więc nie, to nie jest możliwe w C.

Zamiast tego możesz napisać funkcję, która wykonuje inicjalizację dla instancji struktury.

Alternatywnie możesz zrobić:

Następnie zawsze inicjalizuj nowe instancje jako:

Alok Save
źródło
3
Jeśli mam globalną tablicę: „MyStruct arr [MAX_SIXE];”, w jaki sposób można użyć tej funkcji? (Uwaga: nie mogę mieć funkcji init (), która przeszłaby przez wszystkich członków i ustawiła flagę)
user1508893
10
MyStruct_default należy zadeklarować jako const.
Lundin,
1
Dzięki za odpowiedź. Skończyło się na stworzeniu piaskownicy z kodem, aby przetestować go online, początkowo miałem problemy z połączeniem wszystkiego, mam nadzieję, że to pomoże komuś innemu: ideone.com/knQ7xS
HoldOffHunger
52

nie możesz tego zrobić w ten sposób

Zamiast tego użyj następujących

Możesz użyć makra do definiowania i inicjowania swoich instancji. Ułatwi ci to za każdym razem, gdy będziesz chciał zdefiniować nową instancję i zainicjować ją.

a w swoim kodzie, gdy musisz zdefiniować nową instancję z typem pracownika, po prostu wywołaj to makro w następujący sposób:

MOHAMED
źródło
1
Nie wydaje się dobre, jeśli chcesz, aby parametr nie spełniał wymagań.
18

Zgadzam się z Alsem, że nie możesz zainicjować w momencie definiowania struktury w C. Ale możesz zainicjować strukturę w momencie tworzenia instancji pokazanej poniżej.

W C,

w C ++ można podać bezpośrednią wartość w definicji struktury pokazanej poniżej

Chirag Desai
źródło
13

Możesz to zrobić:

A potem musisz tylko pamiętać, aby wykonać domyślną inicjalizację podczas deklarowania nowej zmiennej pracownika:

Alternatywnie możesz zawsze zbudować strukturę pracownika za pomocą funkcji fabryki.

Donnie
źródło
8

Jeśli używasz gcc, możesz dać designated initializersw tworzeniu obiektów.

Lub po prostu użyj podobnej inicjalizacji tablicy.

employee e = {0 , "none"};

Omkant
źródło
1
Widziałem, że w kodzie używano również dwukropków dla wyznaczonych inicjatorów, więcej w tym pytaniu: stackoverflow.com/questions/1601201/ ...
sdaau
7

Utwórz domyślną strukturę, jak wspomniały inne odpowiedzi:

Jednakże powyższy kod nie zadziała w pliku nagłówkowym - dostaniesz błąd: multiple definition of 'MyStruct_default'. Aby rozwiązać ten problem, użyj externzamiast tego w pliku nagłówkowym:

A w cpliku:

Mam nadzieję, że pomoże to każdemu, kto ma problemy z plikiem nagłówkowym.

David Callanan
źródło
Komentarz kilka lat później: Prawdopodobnie bardziej sensowne byłoby, gdybyś mógł to zrobić bezpośrednio w pliku nagłówkowym.
David Callanan
5

Co więcej, aby dodać istniejące odpowiedzi, możesz użyć makra, które ukrywa inicjator struktury:

Następnie w swoim kodzie:

Bogdan Alexandru
źródło
3

Możesz zaimplementować funkcję inicjalizacyjną:

maska ​​bitowa
źródło
Zauważono, że obiekt zmiennej struktury C e (const lub nie) zniknie, gdy blok, w którym jest zdefiniowany, zostanie zamknięty. Jeśli jest to wskaźnik, spowoduje to problem z wiszącym wskaźnikiem. Dlatego nie jest dobrym rozwiązaniem, jeśli typ zwracany jest wskaźnikiem. Najlepszym sposobem jest posiadanie statycznego globalnego obiektu zmiennej strukturalnej z wartościami domyślnymi przy użyciu inicjatorów struktury C i użycie funkcji set i get dla zmiennej w celu zmiany jej wartości w czasie wykonywania programu. Lub przekaż obiekt zmiennej struktury lokalnej do funkcji set jako parametr i zmień jego wartości właściwości wewnątrz funkcji set.
ecle
2
Przepraszamy, ale to po prostu błędne @ecle. Wartość zwracana jest nagą strukturą, a nie wskaźnikiem. Zostanie skopiowany, a nie zwrócony przez odniesienie. Szczerze mówiąc, kompilator prawdopodobnie zoptymalizuje to do cholery.
maska ​​bitów
@bismask Nie zrozum mnie źle. Wspomniałem już, że funkcja zwraca wskaźnik, jeśli jest wskaźnikiem . Może skomentowałeś mój poprzedni komentarz przed moją ostatnią edycją.
ecle,
2

Możesz użyć jakiejś funkcji do zainicjowania struktury w następujący sposób,

EDYTOWAĆ:

Adeel Ahmed
źródło
2
A co jeśli chcę mieć globalną tablicę struktur, jak zaproponujesz wywołanie metody GetMyStruct ()?
user1508893,
Czy GetMyStruct nie powinien używać malloc?
Dmitry
2

Dla maksymalnej wygody można używać kombinacji funkcji preprocesora C z varargami , literałami złożonymi i wyznaczonymi inicjatorami :

Maxim Kulkin
źródło
1

Jeśli użyjesz tej struktury tylko raz , tj. Utworzysz zmienną globalną / statyczną, możesz natychmiast usunąć typedefi zainicjować tę zmienną:

Następnie możesz użyć employeew swoim kodzie.

HaxtraZ
źródło
0

Funkcja inicjująca do struktury to dobry sposób na nadanie jej domyślnych wartości:

Albo jeszcze krócej:

Israel Unterman
źródło
Jeśli mam globalną tablicę: „MyStruct arr [MAX_SIXE];”, w jaki sposób można użyć tej funkcji? (Uwaga: nie mogę mieć funkcji init (), która przeszłaby przez wszystkich członków i ustawiła flagę)
user1508893
0

Inne podejście do wartości domyślnych. Utwórz funkcję inicjalizującą o tym samym typie co struktura. Takie podejście jest bardzo przydatne podczas dzielenia dużego kodu na osobne pliki.

Agronom
źródło
0

Możesz stworzyć dla niego funkcję:

Joseph Pena
źródło
0

Innym podejściem, jeśli pozwala na to struktura, jest użycie #define z domyślnymi wartościami wewnątrz:

Posługiwać się:

CSharpino
źródło
-4

Myślę, że możesz to zrobić w następujący sposób,

Shibu J
źródło
W rzeczywistości jest to pole bitowe, a nie wartość domyślna. pl.cppreference.com/w/cpp/language/bit_field
Bruno Alexandre Rosa