Frage

Warum verbieten die MISRA-Regeln die Verwendung von? #undef in einem Programm?Wenn ich den Umfang eines Makros einschränken möchte, wie mache ich das ohne Verwendung? #undef?

War es hilfreich?

Lösung

Im Grunde, weil MISRA zu paranoid ist und den Programmierern nicht vertraut, dass sie wissen, was sie tun :-) Im Ernst, MISRA versucht, bestimmte Fehler zu verhindern und ist von der Überzeugung geleitet, dass die Zuverlässigkeit von Software plötzlich zunimmt, wenn man potenziell problematische Codekonstrukte verbietet .Ob das wahr ist, ist umstritten.Im Fall von #undef, der wahrscheinliche Grund dafür ist, dass, sobald ein Makro definiert ist, seine Erweiterung erhalten bleibt und immer diejenige aus seiner Definition ist.Wenn du erlaubst #undef, könnte der Bezeichner als Variable, Funktionsname, Typedef oder Struktur-/Union-Mitglied oder sogar als Makro mit einem, gasp, wiederverwendet werden. anders Erweiterung.Wenn Sie so wollen, ist dies eine Möglichkeit, das Shadowing von Identifikatoren zu verhindern.Beängstigend, nicht wahr?!Du entscheidest!

Um Ihre zweite Frage zu beantworten: Die einzige Möglichkeit, den Umfang eines Makros einzuschränken, ist, wenn #undef nicht verwendet werden kann, ist die Verwendung des Dateiendes. Dies ist die einzige andere standardmäßig definierte Möglichkeit, den Gültigkeitsbereich eines Makros zu beenden.Mit anderen Worten: Sie müssen Ihre Quelldateien in kleinere aufteilen und das Makro nur dann definieren, wenn Sie die jeweilige Datei kompilieren, wo es benötigt wird.

Andere Tipps

MISRA hat seine eigene Erklärung, warum die Verwendung von #undef ist verboten:

#undef sollte normalerweise nicht benötigt werden.Seine Verwendung kann zu Verwirrung hinsichtlich der Existenz oder Bedeutung eines Makros führen, wenn es im Code verwendet wird.

Als Antwort auf den Kommentar von @Bubble oben:

Ich bitte Sie, hierzu ein Beispiel zu geben.Ich kann mir nicht vorstellen, wie es Verwirrung erzeugen kann?

Stellen Sie sich das Szenario vor...

#define MACRO some-definition
.
.
MACRO // Invovation 1
.
.
MACRO // Invocation 2
.
.

Und dann kommt jemand und fügt zwischen den bestehenden Aufrufen von MACRO ein

.
.
#undef MACRO
#define MACRO something-else
MACRO // Between (1) and (2)
.
.

Der ursprüngliche zweite Aufruf von MACRO wird nicht das bewirken, was Sie erwartet haben!

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