Zuerst habe ich davon gehört.
Nein; #define
und so weiter sind weit verbreitet. Manchmal zu weit verbreitet, aber definitiv verwendet. Es gibt Stellen, an denen der C-Standard die Verwendung von Makros vorschreibt - diese können Sie nicht einfach vermeiden. Zum Beispiel sagt §7.5 Fehler<errno.h>
:
Die Makros sind
EDOM
EILSEQ
ERANGE
die sich zu ganzzahligen konstanten Ausdrücken mit Typ int
und unterschiedlichen positiven Werten erweitern und für die Verwendung in #if
Vorverarbeitungsanweisungen geeignet sind ; …
Angesichts dessen ist klar, dass nicht alle Industriestandards die Verwendung der Makroanweisungen für C-Präprozessoren verbieten. Es gibt jedoch Standards für bewährte Verfahren oder Codierungsrichtlinien von verschiedenen Organisationen, die Beschränkungen für die Verwendung des C-Präprozessors vorschreiben, obwohl keiner seine Verwendung vollständig verbietet - er ist ein angeborener Teil von C und kann nicht vollständig vermieden werden. Diese Standards gelten häufig für Personen, die in sicherheitskritischen Bereichen arbeiten.
Ein Standard, den Sie überprüfen können, ist der MISRA C (2012) -Standard. das neigt dazu, Dinge zu verbieten, aber selbst das erkennt, dass #define
manchmal et al. benötigt werden (Abschnitt 8.20, Regeln 20.1 bis 20.14 behandeln den C-Präprozessor).
Die C-Codierungsstandards der NASA GSFC (Goddard Space Flight Center) C sagen einfach:
Makros sollten nur bei Bedarf verwendet werden. Übermäßiger Gebrauch von Makros kann das Lesen und Verwalten von Code erschweren, da der Code nicht mehr wie Standard C liest oder sich so verhält.
Die Diskussion nach dieser einleitenden Erklärung veranschaulicht die akzeptable Verwendung von Funktionsmakros.
Der CERT C-Codierungsstandard enthält eine Reihe von Richtlinien zur Verwendung des Präprozessors und impliziert, dass Sie die Verwendung des Präprozessors minimieren sollten, seine Verwendung jedoch nicht verbieten.
Stroustrup möchte den Präprozessor in C ++ irrelevant machen, aber das ist noch nicht geschehen. Wie Peter bemerkt , schreiben einige C ++ - Standards, wie die JSF AV C ++ - Codierungsstandards ( Joint Strike Fighter, Luftfahrzeug ) von ca. 2005, eine minimale Verwendung des C-Präprozessors vor. Im Wesentlichen beschränken sich die JSF AV C ++ - Regeln auf #include
und #ifndef XYZ_H
/ #define XYZ_H
/… / #endif
dance, wodurch mehrere Einschlüsse eines einzelnen Headers verhindert werden. C ++ verfügt über einige Optionen, die in C nicht verfügbar sind - insbesondere eine bessere Unterstützung für typisierte Konstanten, die dann an Stellen verwendet werden können, an denen C die Verwendung nicht zulässt. Siehe auch static const
vs #define
vsenum
für eine Diskussion der dortigen Probleme.
Es ist eine gute Idee, die Verwendung des Präprozessors zu minimieren - er wird häufig mindestens so oft missbraucht wie er verwendet wird (siehe die 'Bibliothek' des Boost- Präprozessors für Abbildungen, wie weit Sie mit dem C-Präprozessor gehen können).
Zusammenfassung
Der Präprozessor ist ein integraler Bestandteil von C #define
und #if
usw. kann nicht vollständig vermieden werden. Die Erklärung des Professor in der Frage ist nicht allgemein gültig: #define
wird zusammen mit den Industrie - Standards verboten #if
, #ifdef
, #else
, und ein paar andere Makros ist eine Over-Anweisung am besten, aber vielleicht mit ausdrücklicher Bezugnahme auf bestimmte Industriestandards erträglich sein (aber Die fraglichen Normen enthalten nicht ISO / IEC 9899: 2011 (die C-Norm).
Beachten Sie, dass David Hammen Informationen zu einem bestimmten C-Codierungsstandard bereitgestellt hat - dem JPL C-Codierungsstandard -, der viele Dinge verbietet, die viele Menschen in C verwenden, einschließlich der Einschränkung der Verwendung des C-Präprozessors (und der Einschränkung der Verwendung des dynamischen Speichers) Zuordnung und Verbot der Rekursion - lesen Sie es, um herauszufinden, warum und entscheiden Sie, ob diese Gründe für Sie relevant sind.
#define
und so weiter sind weit verbreitet. Manchmal zu weit verbreitet, aber definitiv verwendet. Es gibt Stellen, an denen der C-Standard die Verwendung von Makros vorschreibt - diese können Sie nicht einfach vermeiden. Sie können die MISRA C-Standards überprüfen. Sie neigen dazu, Dinge zu verbieten, aber ich bin mir ziemlich sicher, dass selbst sie erkennen, dass#define
et al manchmal benötigt werden.