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:


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:


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:


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


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.


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"};


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.


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:


3

Możesz zaimplementować funkcję inicjalizacyjną:


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Ć:


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


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.


0

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

Albo jeszcze krócej:


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.


0

Możesz stworzyć dla niego funkcję:


0

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

Posługiwać się:


Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.