617 Stimmen

Initialisierung einer Struktur in Übereinstimmung mit den Standards der Programmiersprache C

Ich möchte ein struct-Element initialisieren, aufgeteilt in Deklaration und Initialisierung. Dies ist, was ich habe:

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 der Weg, um eine lokale Variable von MY_TYPE in Übereinstimmung mit den Standards der Programmiersprache C (C89, C90, C99, C11, etc.)? Oder gibt es etwas Besseres oder zumindest Funktionierendes?

Update Am Ende hatte ich ein statisches Initialisierungselement, in dem ich jedes Unterelement nach meinen Bedürfnissen einstellte.

24voto

Kieveli Punkte 10750

Du hast es fast geschafft...

MY_TYPE a = { true, 15, 0.123 };

Schnell Suche nach 'struct initialize c' zeigt mir dies

24voto

Federico Baù Punkte 3486

Zusätzlich zu all diesen guten Antworten eine Zusammenfassung, wie man eine Struktur (Union und Array) in C initialisiert, mit besonderem Augenmerk auf den Designed Initializer.

Standard-Initialisierung

struct point 
{
    double x;
    double y;
    double z;
}

p = {1.2, 1.3}; 

Bezeichneter Initialisierer

Der Designated Initializer ist seit ISO C99 aufgetaucht und ist eine andere und dynamischere Art, in C zu initialisieren, wenn man struct , union oder ein array .

Der größte Unterschied zur Standardinitialisierung besteht darin, dass Sie die Elemente nicht in einer festen Reihenfolge deklarieren müssen und dass Sie auch Elemente weglassen können.

Von der GNU-Leitfaden :

Der C90-Standard verlangt, dass die Elemente eines Initialisierers in einer festen Reihenfolge erscheinen, die der Reihenfolge der Elemente in dem zu initialisierenden Array oder der Struktur entspricht.

In ISO C99 kann man die Elemente in zufälliger Reihenfolge angeben, indem man die Array-Indizes oder Strukturfeldnamen angibt, auf die sie sich beziehen, und GNU C erlaubt dies als Erweiterung auch im C90-Modus


事例紹介

1. Array-Index

Standard-Initialisierung

int a[6] = { 0, 0, 15, 0, 29, 0 };

Bezeichnete Initialisierung

int a[6] = {[4] = 29, [2] = 15 }; // or
int a[6] = {[4]29 , [2]15 }; // or
int widths[] = { [0 ... 9] = 1, [10 ... 99] = 2, [100] = 3 };

2. Struktur oder Vereinigung:

Standard-Initialisierung

struct point { int x, y; };

Bezeichnete Initialisierung

struct point p = { .y = 2, .x = 3 }; or
struct point p = { y: 2, x: 3 };

3. Kombinieren Sie die Benennung von Elementen mit der normalen C-Initialisierung aufeinanderfolgender Elemente:

Standard-Initialisierung

int a[6] = { 0, v1, v2, 0, v4, 0 };

Bezeichnete Initialisierung

int a[6] = { [1] = v1, v2, [4] = v4 };

4. Andere:

Beschriftung der Elemente eines Array-Initialisierers

int whitespace[256] = { [' '] = 1, ['\t'] = 1, ['\h'] = 1,
                        ['\f'] = 1, ['\n'] = 1, ['\r'] = 1 };

eine Reihe von '.fieldname' und '[index]' Bezeichnern vor ein '=' schreiben, um ein verschachteltes Unterobjekt zu initialisieren

struct point ptarray[10] = { [2].y = yv2, [2].x = xv2, [0].x = xv0 };

Leitfäden

17voto

r_goyal Punkte 1077

Als Ron Nuni sagte :

typedef struct Item {
    int a;
    float b;
    char* name;
} Item;

int main(void) {
    Item item = {5, 2.2, "George"};
    return 0;
}

Ein wichtiger Hinweis: Sobald Sie auch nur ein Objekt/eine Variable in der Struktur initialisieren, werden alle anderen Variablen mit dem Standardwert initialisiert.

Wenn Sie die Werte in Ihrer Struktur nicht initialisieren (d.h. wenn Sie die Variable nur deklarieren), werden alle variable.members wird "Müllwerte" enthalten, nur wenn die Erklärung lokal ist!

Wenn die Erklärung global oder statisch (wie in diesem Fall), alle uninitialisierten variable.members wird automatisch auf initialisiert:

  • 0 für Ganzzahlen und Gleitkomma
  • '\0' pour char (dies ist natürlich dasselbe wie 0 und char ein ganzzahliger Typ ist)
  • NULL für Zeiger.

6voto

Alan Corey Punkte 479

Mir gefiel keine dieser Antworten, also habe ich mir eine eigene ausgedacht. Ich weiß nicht, ob das ANSI C ist oder nicht, es ist einfach GCC 4.2.1 in seinem Standardmodus. Ich kann mir die Klammern nie merken, also fange ich mit einer Teilmenge meiner Daten an und kämpfe mit Compiler-Fehlermeldungen, bis es aufhört. Lesbarkeit ist meine oberste Priorität.

// in a header:
typedef unsigned char uchar;

struct fields {
  uchar num;
  uchar lbl[35];
};

// in an actual c file (I have 2 in this case)
struct fields labels[] = {
  {0, "Package"},
  {1, "Version"},
  {2, "Apport"},
  {3, "Architecture"},
  {4, "Bugs"},
  {5, "Description-md5"},
  {6, "Essential"},
  {7, "Filename"},
  {8, "Ghc-Package"},
  {9, "Gstreamer-Version"},
  {10, "Homepage"},
  {11, "Installed-Size"},
  {12, "MD5sum"},
  {13, "Maintainer"},
  {14, "Modaliases"},
  {15, "Multi-Arch"},
  {16, "Npp-Description"},
  {17, "Npp-File"},
  {18, "Npp-Name"},
  {19, "Origin"}
};

Die Daten können als Tabulator-getrennte Datei beginnen, die Sie durch Suchen und Ersetzen in etwas anderes umwandeln. Ja, das ist Debian-Zeug. Also ein äußeres Paar {} (das das Array angibt), dann ein weiteres Paar für jede Struktur innerhalb. Mit Kommas dazwischen. Die Dinge in einen Header zu setzen ist nicht unbedingt notwendig, aber ich habe ungefähr 50 Elemente in meiner Struktur, also möchte ich sie in einer separaten Datei haben, sowohl um das Durcheinander aus meinem Code herauszuhalten als auch um sie leichter ersetzen zu können.

3voto

robert Punkte 1210
void function(void) {
  MY_TYPE a;
  a.flag = true;
  a.value = 15;
  a.stuff = 0.123;
}

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X