2009-02-17 4 views
30

Von msdn bekomme ich diese:C#: Ist die Wiederherstellung von Pragma-Warnungen erforderlich?

#pragma warning disable warning-list 
#pragma warning restore warning-list 

In den Beispielen, die beide disable und restore verwendet werden. Ist es notwendig, restore, wenn ich es für eine ganze Datei deaktiviert wollen?

Wie, wenn ich nicht wiederherstellen, wie weit es trägt? Sind die Warnungen für alles, was danach kompiliert wird, deaktiviert? Oder nur für den Rest dieser Datei? Oder wird es ignoriert?

Antwort

35

Wenn Sie nicht wiederherstellen, ist die Deaktivierung für den Rest der Datei aktiv.

Interessanterweise ist dieses Verhalten nicht definiert in der language specification. (siehe Abschnitt 9.5.8) jedoch die 9.5.1 Abschnitt auf Bedingte Kompilierung Symbole anzeigt dies „bis zum Ende des Datei Verhalten“

Das Symbol, bis eine #undef Richtlinie definiert bleibt für das gleiche Symbol verarbeitet wird oder bis das Ende der Quelldatei erreicht ist.

der ‚Pre-Prozessor‘ Da ist tatsächlich Teil der lexikalischen Analysephase der Zusammenstellung ist es wahrscheinlich, dass dieses Verhalten für Microsoft und alle andere Implementierungen für die absehbare Zukunft (zumal die alternativen wäre ein wirksamer Vertrag sehr komplex und nicht deterministisch basierend auf Quelldatei Kompilierreihenfolge)

+1

Zusammenfassend: Verhalten nicht definiert, also müssen wir wiederherstellen – Julian

2

Nein, Sie werden feststellen, dass der Compiler automatisch jede deaktivierte Warnung wiederherstellt, sobald die Analyse einer Quelldatei abgeschlossen ist.

#pragma warning disable 649 
struct MyInteropThing 
{ 
    int a; 
    int b; 
} 
#pragma warning restore 649 

In dem obigen Beispiel habe ich Warnung CS00649 gedreht, weil ich beabsichtige, diese Struktur in einer unsicheren Weise zu verwenden. Der Compiler merkt nicht, dass ich in den Speicher schreiben werde, der diese Art von Layout hat, also werde ich die Warnung ignorieren wollen:

Feld 'Feld' ist nie zugewiesen und wird immer seinen Standardwert haben 'Wert'

Aber ich möchte nicht die gesamte Datei nicht deaktiviert werden.

+0

Was ist, wenn die Warnung bereits durch ein Befehlszeilenargument deaktiviert wurde? Sie werden am Ende wiederherstellen, was Sie nicht sollten. – drowa

+0

@drowa dann ist angenommen, Sie brauchen die Deaktivierung an erster Stelle nicht. Nach meinem Wissen gibt es nichts, was C++ push/pop im C# -Compiler entspricht.Es wird also nicht besser. –

3

Nehmen wir an, ich habe ein privates Feld, das mit Reflexionen initialisiert wird, der Compiler kann offensichtlich keinen Code direkt in dieses Feld schreiben finden, so wird es eine Warnung anzeigen - das möchte ich nicht zeigen.

Lassen Sie uns auch sagen, ich habe ein anderes privates Feld definiert 3 Zeilen unterhalb der ersten, die ich vergessen zu initialisieren, wenn ich die Warnung für die gesamte Datei deaktivieren wird dies keine Warnung auslösen.

Also, die beste Verwendung für #pragma warnen, eine "Warnung deaktivieren" direkt vor der Zeile, die die Warnung, die ich unterdrücken möchte und eine "Warnung wiederherstellen" gleich nach der Zeile, so die gleiche Bedingung in a Ein anderer Speicherort in der Datei löst weiterhin eine Warnung aus.

+0

Sie gaben einen Anwendungsfall und schließen, dass alle anderen Anwendungsfälle identisch sind. Außerdem sollte dies eher ein Kommentar als eine Antwort sein. –

+1

@MichaWiedenmann - Ich habe versucht, mit einem Beispiel zu erklären, ich hätte schreiben können "manchmal haben Sie zwei Warnungen des gleichen Typs in der gleichen Datei, wo der erste ein falscher positiver ist, aber der zweite ein echter Fehler" - wäre das besser Antworten? Meiner Meinung nach nein, die Leute würden behaupten, dass es keine realen Anwendungsfälle gibt (wenn sie nicht aufhören würden, bei "falsch positiv" zu lesen) – Nir

Verwandte Themen