2013-12-07 3 views
7

Während durch einige C-Header-Dateien (speziell stdarg.h) suchen, bemerkte ich eine sehr eigenartige Linie:Hinzufügen von Null in c Präprozessoranweisung

#if !defined(__STRICT_ANSI__) || __STDC_VERSION__ + 0 >= 199900L 

Das seltsame Teil ist die + 0. Null ist die additive Identität; es ist eine der verschiedenen Mathematik hat Schreiben noop.

Welchen Zweck hat das Hinzufügen von Null in der obigen Präprozessoranweisung? Ich weiß, dass es all sorts of weird preprocessor magic da draußen gibt, aber das scheint nur lächerlich.

Antwort

12

Das vermeidet einen Präprozessor-Syntaxfehler, wenn __STDC_VERSION__ als ein leeres Token definiert ist (z. B. mit #define __STDC_VERSION__).

(Danke an Jens Gustedt für den Hinweis, dass die erste Version meiner Antwort falsch war.)

+1

Nicht ganz korrekt. Die Regeln für die Präprozessorbewertung haben Token unbekannter Bezeichner, die mit 0 bewertet wurden. Es wäre also in Ordnung, wenn sie nicht definiert wären. Der Fall, in dem es darauf ankommt, ist, wann es definiert werden würde, aber zu dem leeren Token. –

+0

@JensGustedt: Sie haben Recht, ich habe gerade versucht, meine Antwort in einigen Test-Code zu überprüfen und bemerkte, dass es nicht korrekt ist. Ich hoffe, dass es jetzt richtig ist. –

+0

Verdreht. Ich denke, das + Zeichen wird nur als unärer Operator interpretiert, wenn das Token leer ist. – ApproachingDarknessFish

Verwandte Themen