Ich möchte ein Strukturelement initialisieren, das in Deklaration und Initialisierung aufgeteilt ist. Das habe ich:
typedef struct MY_TYPE {
bool flag;
short int value;
double stuff;
} MY_TYPE;
void function(void) {
MY_TYPE a;
...
a = { true, 15, 0.123 }
}
Ist dies die Möglichkeit, eine lokale Variable MY_TYPE
gemäß den Programmiersprachenstandards C (C89, C90, C99, C11 usw.) zu deklarieren und zu initialisieren ? Oder gibt es etwas Besseres oder zumindest funktionierendes?
Update Am Ende hatte ich ein statisches Initialisierungselement, in dem ich jedes Unterelement gemäß meinen Anforderungen festlegte.
c
struct
initialization
zusammenzucken
quelle
quelle
Antworten:
In (ANSI) C99 können Sie einen bestimmten Initialisierer verwenden , um eine Struktur zu initialisieren:
Bearbeiten: Andere Elemente werden als Null initialisiert: "Ausgelassene Feldelemente werden implizit genauso initialisiert wie Objekte mit statischer Speicherdauer." ( https://gcc.gnu.org/onlinedocs/gcc/Designated-Inits.html )
quelle
Sie können dies mit einem zusammengesetzten Literal tun . Laut dieser Seite funktioniert es in C99 (was auch als ANSI C zählt ).
Die Bezeichnungen in den Initialisierern sind optional. Sie könnten auch schreiben:
quelle
Ich sehe, dass Sie bereits eine Antwort zu ANSI C 99 erhalten haben, also werde ich einen Bone über ANSI C 89 werfen. Mit ANSI C 89 können Sie eine Struktur folgendermaßen initialisieren:
Beachten Sie Folgendes: Wenn Sie auch nur ein Objekt / eine Variable in der Struktur initialisieren, werden alle anderen Variablen auf den Standardwert initialisiert.
Wenn Sie die Werte in Ihrer Struktur nicht initialisieren, enthalten alle Variablen "Garbage-Werte".
Viel Glück!
quelle
a = (MYTYPE){ true, 15, 0.123 };
würde in C99 gut tun
quelle
Du hast es fast geschafft ...
Die schnelle Suche nach 'struct initialize c' zeigt mir dies
quelle
Der C-Programmiersprachenstandard ISO / IEC 9899: 1999 (allgemein bekannt als C99) ermöglicht die Verwendung eines bestimmten Initialisierers , um Mitglieder einer Struktur oder Vereinigung wie folgt zu initialisieren:
Es ist in
paragraph 7
Abschnitt6.7.8 Initialization
der Norm ISO / IEC 9899: 1999 definiert als:Beachten Sie, dass
paragraph 9
im selben Abschnitt Folgendes angegeben ist:In der GNU-GCC-Implementierung werden jedoch ausgelassene Elemente als null- oder nullähnlicher typgerechter Wert initialisiert. Wie in Abschnitt 6.27 angegeben. Designated Initializers der GNU GCC-Dokumentation:
Der Microsoft Visual C ++ - Compiler sollte laut Version C ++ Conformance Roadmap seit Version 2013 bestimmte Initialisierer unterstützen . Der Absatz
Initializing unions and structs
des Initializer- Artikels in der Dokumentation zu MSDN Visual Studio schlägt vor, dass unbenannte Mitglieder ähnlich wie GNU GCC auf nullähnliche Werte initialisiert werden.Die Norm ISO / IEC 9899: 2011 (allgemein bekannt als C11), die die Norm ISO / IEC 9899: 1999 abgelöst hat, behält die gemäß Abschnitt angegebenen Initialisierer bei
6.7.9 Initialization
. Es bleibt auchparagraph 9
unverändert.Die neue Norm ISO / IEC 9899: 2018 (allgemein bekannt als C18), die die Norm ISO / IEC 9899: 2011 abgelöst hat, behält die gemäß Abschnitt angegebenen Initialisierer bei
6.7.9 Initialization
. Es bleibt auchparagraph 9
unverändert.quelle
struct thing { union { char ch; int i; }; };
. Der Standard sagt später: "Wenn eine in Klammern eingeschlossene Liste weniger Initialisierer enthält als Elemente oder Elemente eines Aggregats oder weniger Zeichen in einem Zeichenfolgenliteral, das zum Initialisieren eines Arrays bekannter Größe verwendet wird, als Elemente im Array vorhanden sind, Der Rest des Aggregats wird implizit genauso initialisiert wie Objekte mit statischer Speicherdauer. "wie Ron Nuni sagte:
Ein wichtiger Punkt, den Sie beachten sollten: Wenn Sie auch nur ein Objekt / eine Variable in der Struktur initialisieren, werden alle anderen Variablen auf den Standardwert initialisiert.
Wenn Sie die Werte in Ihrer Struktur nicht initialisieren (dh wenn Sie nur diese Variable deklarieren),
variable.members
enthalten alle nur dann "Garbage-Werte", wenn die Deklaration lokal ist!Wenn die Deklaration global oder statisch ist (wie in diesem Fall), werden alle nicht
variable.members
initialisierten automatisch initialisiert, um:0
für ganze Zahlen und Gleitkomma'\0'
fürchar
(natürlich ist dies genau das gleiche wie0
undchar
ein ganzzahliger Typ)NULL
für Zeiger.quelle
quelle
Wenn MS nicht auf C99 aktualisiert wurde, ist MY_TYPE a = {true, 15,0.123};
quelle
Ich habe einen anderen Weg gefunden, um Strukturen zu initialisieren.
Die Struktur:
Initialisierung:
Gemäß der Dokumentation von GCC ist diese Syntax seit GCC 2.5 veraltet .
quelle
Ich mochte keine dieser Antworten, also habe ich meine eigenen gemacht. Ich weiß nicht, ob dies ANSI C ist oder nicht, es ist nur GCC 4.2.1 im Standardmodus. Ich kann mich nie an die Klammer erinnern, also beginne ich mit einer Teilmenge meiner Daten und kämpfe mit Compiler-Fehlermeldungen, bis sie geschlossen werden. Lesbarkeit ist meine oberste Priorität.
Die Daten beginnen möglicherweise als tabulatorgetrennte Datei, die Sie suchen und ersetzen, um sie in etwas anderes zu massieren. Ja, das ist Debian-Zeug. Also ein äußeres Paar von {} (das das Array angibt), dann ein weiteres Paar für jede innere Struktur. Mit Kommas zwischen. Das Einfügen von Dingen in einen Header ist nicht unbedingt erforderlich, aber ich habe ungefähr 50 Elemente in meiner Struktur, sodass ich sie in einer separaten Datei haben möchte, um das Durcheinander aus meinem Code herauszuhalten und es einfacher zu ersetzen.
quelle
Die Struktur in C kann folgendermaßen deklariert und initialisiert werden:
quelle
Ich habe die Microsoft Visual Studio 2015-Dokumentation zum Initialisieren von Aggregattypen bereits gelesen. Dort werden alle Formen der Initialisierung mit
{...}
erläutert, aber die Initialisierung mit Punkt mit dem Namen "Bezeichner" wird dort nicht erwähnt. Es funktioniert auch nicht.Das C99-Standardkapitel 6.7.8 Initialisierung erklärt die Möglichkeit von Bezeichnern, aber meiner Meinung nach ist es für komplexe Strukturen nicht wirklich klar. Der C99 Standard als pdf .
In meinen Augen ist es vielleicht besser
= {0};
Initialisierung für alle statischen Daten. Der Maschinencode ist weniger aufwendig.Verwenden Sie zum Beispiel Makros zum Initialisieren
typedef MyStruct_t{ int x, int a, int b; } MyStruct; define INIT_MyStruct(A,B) { 0, A, B}
Das Makro kann angepasst werden, seine Argumentliste kann unabhängig vom geänderten Strukturinhalt sein. Es ist richtig, wenn weniger Elemente initialisiert werden sollen. Es ist auch für verschachtelte Strukturen geeignet. 3. Eine einfache Form ist: In einer Unterroutine initialisieren:
Diese Routine sieht aus wie in objekt C. Verwendung
thiz
, nichtthis
mit C ++ zu kompilieren auch!quelle
Ich habe nach einer guten Möglichkeit gesucht, meine Struktur zu initialisieren, und ich muss die folgende verwenden (C99). Auf diese Weise kann ich entweder eine einzelne Struktur oder ein Array von Strukturen auf die gleiche Weise wie einfache Typen initialisieren.
Dies kann im Code wie folgt verwendet werden:
quelle
jsmn_ts_default
, aber der Rest der Strukturen wird so initialisiert, als ob das Array eine statische Speicherdauer hätte, was bedeutet, dass die Mitglieder mitNULL
und initialisiert werden0
. Wenn Sie jedoch zu wechseln, werden#define jsmn_ts_default (jsmn_ts){"default", sizeof "default", NULL, 0}
Sie feststellen, dass nur das erste Array-Element so initialisiert wird.int a[10] = {1};
Nur das 1. Element wird sein==1