2010-05-08 18 views
13

ich von # raten bin, dass es nur ein Compiler-Programm ist. Wie kann es in C/C++ - Programmen verwendet werden?Wie funktioniert #error in C/C++?

Habe nicht viel darüber im Internet gefunden. Alle Links wären hilfreich.

Antwort

12

Es verursacht den Compiler (oder Präprozessor), die Fehlermeldung auszugeben. In C++ rendert es auch die Übersetzungseinheit schlecht ausgebildet (d. H. Sie bewirkt, dass die Kompilierung fehlschlägt).

Wenn Sie mehrere Makros, die definiert werden könnten, und Sie wollen sicher sein, dass nur bestimmte Kombinationen von ihnen definiert sind, können Sie #error verwenden Kompilierung fehlschlagen, wenn eine ungültige Kombination definiert ist.

Es kann auch nützlich sein, wenn Sie sicher sein wollen, dass einige Code-Blöcke nie kompiliert werden (aus welchen Gründen auch immer). Hier

+1

, was Sie meinen damit „nur bestimmte Kombinationen von Makros definiert“. Können Sie ein Beispiel zitieren? Vielen Dank. – Moeb

+0

@cambr: Wenn Sie zum Beispiel zwei Makros 'DO_X' und' DO_Y' haben und sicherstellen wollen, dass immer nur eins gesetzt ist, können Sie eine '# error' Direktive in ein '#if (definiertes DO_X) && (definiert DO_Y) 'Block. –

+5

@cambr: Sagen Sie Ihrem Unternehmen Slicer ™ und Dicer ™ verkauft. Beide Produkte verwenden 'blade.c', aber sie übergeben verschiedene Makros durch das Build-System für etwas andere Funktionalität. Dann könnten Sie '#if SLICING ... #elif DICING ... #else #error Keine von makefile.' ausgewählten Funktionalität – Potatoswatter

2

ist ein Link auf die Dokumentation des Gnu Präprozessor Erläuterung der #error und #warning Richtlinien: http://gcc.gnu.org/onlinedocs/cpp/Diagnostics.html

Insbesondere:

Die Richtlinie #error die Präprozessor wird einen fatalen Fehler zu melden. Die Token, die den Rest der Zeile nach #error bilden, werden als die Fehlermeldung verwendet.

Siehe auch this question über die Portabilität dieser Richtlinien.

+4

Die' # error' Richtlinie ist Teil der C und C++ Standards und ist vollständig tragbar. '# warning' ist eine gcc-spezifische Spracherweiterung. –

+0

@james, danke für die Klarstellung. – UncleZeiv

9

Dies ist nützlich, um Compilereinstellungen zu überprüfen und Makrowertkombinationen zu überprüfen. Einige zufällige Beispiele:

#if !defined(_DLL) 
# error This code will only work properly when compiled with /MD 
#endif 

#if _WIN32_WINNT < 0x502 
# error Sorry, Windows versions prior to XP SP2 are not supported 
#endif 

#if defined(_APPLE) && defined(_LINUX) 
# error Conflicting operating system option selected, choose one. 
#endif 
+0

Behandelst du den letzten wirklich in der Praxis? Ist es nicht die Verantwortung des Benutzers, nicht braindead zu sein und keine unsinnigen Compiler-Flags zu verwenden? Sie können nicht * alles überprüfen * ... – Thomas

+3

Es ist nur ein Beispiel. Sie neigen dazu, dieses Zeug hinzuzufügen, wenn Sie einen Support-Anruf zu viele haben. Boost ist zum Beispiel weit verbreitet. –