Frage

Eine Codierung Stil-Präsentation, die ich in letzter Zeit im Amt besuchte dafür ausgesprochen, dass Variablen nicht (auf einen Standardwert) zugewiesen werden, wenn sie definiert sind. Stattdessen sollten sie einen Standardwert kurz vor ihrer Verwendung zugewiesen werden. Also, so etwas wie

int a = 0;

sollte verpönt.

Offensichtlich ist ein Beispiel für ‚int‘ simpel, aber das gleiche folgt für andere Arten auch wie Zeiger etc.

Ferner wurde auch erwähnt, dass die C99-kompatible Compiler nun eine Warnung in dem oben genannten Fall werfen.

Der obige Ansatz sucht nach Strukturen mir nur nützlich, das heißt man sich vor dem Gebrauch nur memset. Dies wäre dann effizient, wenn die Struktur verwendet wird (oder gefüllt) nur in einem Fehler Beine.

Für alle anderen Fälle, finde ich die Definition und Zuordnung auf einen Standardwert eine umsichtige Übung, wie ich viele Fehler wegen nicht initialisierten Zeiger begegnet ist sowohl beim Schreiben und Code erhalten bleibt. Außerdem glaube ich, C ++ über Konstrukteure auch den gleichen Ansatz befürwortet das heißt definieren und zuweisen.

Ich frage mich, warum (wenn) C99-Standard nicht wie die Definition und Zuordnung. Ist sie eine nennenswerte Verdienst zu tun, was die Codierung Stil Präsentation befürwortete?

War es hilfreich?

Lösung

Normalerweise würde ich empfehlen, Variablen initialisiert, wenn sie definiert sind, wenn der Wert sollten sie bekannt haben, und Variablen lassen uninitialised, wenn der Wert nicht. So oder so, legt sie auf ihre Verwendung so nah wie Scoping-Regeln erlauben.

  

Stattdessen sollten sie einen Standardwert kurz vor ihrer Verwendung zugeführt werden.

In der Regel sollten Sie keinen Standardwert überhaupt. In C99 können Sie Code und Erklärungen mischen, so dass es keinen Punkt definieren die Variable, bevor Sie einen Wert zuweisen. Wenn Sie den Wert es sollte wissen, nimmt dann gibt es keinen Punkt in einen Standardwert.

  

Ferner wurde auch erwähnt, dass die C99-kompatible Compiler nun eine Warnung in dem oben genannten Fall werfen.

Nicht für den Fall, dass Sie zeigen - bekommt man nicht eine Warnung für int x = 0; haben. Ich nehme stark an, dass jemand hat dies vermischt. Compiler warnen, wenn Sie eine Variable verwenden, ohne einen Wert zuweisen, und wenn Sie:

... some code ...

int x;

if ( a )
    x = 1;
else if ( b )
    x = 2;
// oops, forgot the last case else x = 3;

return x * y;

dann erhalten Sie eine Warnung erhalten, die x verwendet werden kann, ohne initialisiert wird, zumindest mit gcc.

Sie werden keine Warnung erhalten, wenn Sie einen Wert x vor dem if zuweisen, aber es spielt keine Rolle, ob die Zuordnung als initialiser oder als separate Anweisung erfolgt.

Wenn Sie einen bestimmten Grund haben, den Wert zweimal für zwei der Zweige zuweisen, gibt es keinen Grund den Standardwert x ersten Zuweisung, da es den Compiler hält Sie warnen, dass Sie jeden Zweig behandelt haben.

Andere Tipps

Es gibt nicht solche Anforderung (oder sogar Richtlinie, die ich kenne) in C99, noch der Compiler warnt Sie darüber. Es ist einfach eine Frage des Stils.

Was Codierung Stil angeht, ich glaube, Sie Dinge zu wörtlich nahm. Zum Beispiel Ihrer Aussage richtig ist im folgenden Fall ...

int i = 0;

for (; i < n; i++)
        do_something(i);

... oder sogar in ...

int i = 1;

[some code follows here]

while (i < a)
        do_something(i);

... aber es gibt andere Fälle, dass in meinem Kopf, besser mit einem frühen behandelt werden „deklarieren und zuweisen“. Betrachten Sie konstruierten Strukturen auf den Stapel oder verschiedenen OOP-Konstrukte, wie in:

struct foo {
        int bar;

        void *private;
};

int my_callback(struct foo *foo)
{
        struct my_struct *my_struct = foo->private;

        [do something with my_struct]

        return 0;
}

oder wie in (C99 struct initializers):

void do_something(int a, int b, int c)
{
        struct foo foo = {
                .a        = a,
                .b        = b + 1,
                .c        = c / 2,
        };

        write_foo(&foo);
}

ich irgendwie mit dem Rat einig, auch wenn ich nicht ganz sicher bin, der Standard sagt nichts darüber, und ich bezweifle sehr, das wenig über Compiler-Warnungen wahr ist.

Die Sache ist, moderne Compiler können und die Verwendung von nicht initialisierten Variablen erkennen. Wenn Sie Ihre Variablen auf Standardwerte bei der Initialisierung gesetzt, verlieren Sie, dass die Detektion. Und Standardwerte können Fehler verursachen auch; sicherlich im Fall von Ihrem Beispiel int a = 0;. Wer sagt, dass 0 ist ein geeigneter Wert für a?

In den 1990er Jahren habe der Rat falsch gewesen. Heutzutage ist es richtig.

Ich finde es sehr nützlich, einige Standarddaten auf Variablen vorbelegen, so dass ich (wie viele) null Kontrollen im Code nicht zu tun.

Ich habe so viele Fehler auf nicht initialisierten Zeiger auf Grund gesehen, die ich befürwortete immer jede Variable mit NULL_PTR zu erklären und jeder primitivewith einig ungültigen / Standardwertes.

Da ich auf RTOS arbeiten und eine hohe Leistung, aber geringe Ressourcensystemen ist es möglich, dass die Compiler verwenden wir nicht fangen nicht initialisierten Nutzung. Obwohl ich auch moderne Compiler zweifeln kann auf 100% verlassen.

Bei großen Projekten, bei denen Macros ausgiebig verwendet werden, habe ich selten Szenarien gesehen, wo auch Kloclwork / Entschlacken ausgefallen ist nicht initialisierten Nutzung zu finden.

Also sage ich es bleiben, solange Sie nur alte C verwenden / C ++.

Moderne Sprachen wie .Net kann garantieren varaibles zu initialisieren, oder einen Compiler-Fehler geben für nicht initialisierte Variable Nutzung. Der Link funktioniert eine Performance-Analyse und bestätigt, dass es eine für .NET schlagen 10-20% Leistung. Die Analyse ist in ganz ausführlich und gut erklärt.

http://www.codeproject.com/KB/dotnet/DontInitializeVariables.aspx

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top