Ungewöhnliches Verhalten der C-Preprocessors
-
mysterio schrieb:
..., dass es absolut legaler CPP-Code ist.
Nur weil etwas legal ist, heisst es nicht, dass es auch korrekt ist. Gerade in C und C++ können Dinge oft in der Syntax legal sein, tatsächlich aber völlig falsch und zum Teil undefiniert.
mysterio schrieb:
Wird, wie ich ja schon in vorangegangen Postings schrieb, ebenfalls so in Standarddateien(z.B. ctype.h) der libc so gemacht. Und es ist auch üblich dies so zu machen, habe ich schon vielfach auch in anderen Projekten gesehen.
Daran ist auch nichts auszusetzen, wenn man denn das entsprechende Verhalten möchte, welches daraus entsteht. Vielleicht ist es in den Fällen überall so, dass mit Sicherheit feststeht, dass die Makros ganz sicher definiert sind, bevor sie verwendet werden. Es kommt daher auf den Zusammenhang an, ob etwas richtig oder falsch ist. In deinem Kontext war es aber nunmal falsch. Du hast den Präprozessor falsch angewendet.
mysterio schrieb:
Es wäre halt meiner Meinung nach sinnvoll, das z.B. -Wundef bei -Wall -pedantic mit dabei ist. Dann wäre es aufgefallen, dass ein Makro nicht definiert ist und ich hätte nicht ewig suchen müssen, warum das Programm so ein merkwürdiges (da falsch konfiguriert) Verhalten zeigt. Wenn man keine Warnung dieser Art haben, kann man auch einzelne Warnungen explizit unterdrücken.
Es muss ja auch gar nicht gewarnt werden. Es kommt mir ein wenig vor, wie die Leute, welche eine Warnung für folgenden Code verlangen:
void foo(int i, int a) { if(i = a) // <- hierfür, da womöglich == gemeint war. { // ... } }Dabei ist das legaler C++ Code, kann aber im Kontext den man wollte falsch sein. Es kann aber auch gewollt sein. Deshalb wird es hierfür auch keine Warnung geben. Wieso sollte man Warnungen für etwas bekommen, was man wollte und legal korrekter C++ Code ist?
Grüssli
-
Dravere schrieb:
Wieso sollte man Warnungen für etwas bekommen, was man wollte und legal korrekter C++ Code ist?
mir haben ähnliche warnungen schon geholfen.
es würde nur dazu führen, daß man sich im seltenen fall so einer zuweisung ein wanungsvermeidungsidiom einfallen lassen muss, zum beispiel einfachif( (i = a) != 0 )oder
if( i = a , i != 0 )oder
if( i = a , i )oder
i = a; if( i != 0 )oder
i = a; if( i )
-
@Dravere ich glaube Du liegst mit deiner Aussage, dass dies keine Warnung erzeugt nur zur Hälfte richtig, denn
Wenn ich den Compiler ohne weitere Optionen aufrufe außer den zu übersetzenden Dateien, stimmt sie, aber wenn ich -Wall benutze kommt sehr wohl eine Warnung. Und genau dieses meinte ich ja, als ich schrieb dass bei undefinierten Makros auch gewarnt werden könnte/sollte, wenn man -Wall benutzt. Schließlich will man ja alle Warnungen haben. Die Warnung bei deinem Code könnte man wie volkard schrieb ja auch recht einfach umgehen bzw. einen entsprechenden Compilerswitch benutzen, der diese dann abschaltet.
Folglich nochmals ich meine nicht, dass der Compiler einfach so warnen sollte, aber wenn ich schon -Wall und -pedantic aus Sicherheitsgründen benutze, um alle möglichen Fallstricke zu entdecken, sollte er auch vor undefinierten Makros warnen. So sehe ich dies zumindest. Und nur weil etwas momentan bei den Compilern oder im Standard definiert ist, heißt dies ja nicht automatisch, dass dies immer die beste Herangehensweise oder das Optimum ist. Ich will jetzt aber keine Dikussion darüber lostreten, weshalb ich die letzte Aussage nicht falsch verstanden wissen möchte.
Ein weiteres Beispiel wäre ja auch ein Tippfehler beim Schreiben einer Makroabfrage im #if und schon steht dort einen 0. Wenn der CPP aber warnen würde, dass das Makro nicht definiert ist, wäre dies nicht so tragisch, da leicht zu entdecken. Und lieber eine Warnung mehr und Hilfe vom Compiler, als still schweigend etwas zu machen, was zwar Standard ist, aber z.B. beim Schreibfehler eben nicht die Intention war.
Grüße