Ich würde nicht empfehlen #WARNING verwenden, da es nicht Standard C. Außerdem ist, was ist es, dass Sie gegen warnen wollen, aber keinen Fehler gegen werfen? Warnungen sind in der Regel etwas, das der Compiler verwendet, wenn Sie etwas tun, was verdächtig ist, oder sogar unser C-Standard. Sie haben keinen solchen Fall in der normalen Anwendung, Sie werden wollen, dass es entweder fehlerlos oder gar nicht kompiliert. Deshalb würde ich standard # error und nicht standard # warning verwenden.
Sie können den tatsächlichen Inhalt der Preprozessor-Definition nicht eingeben. So etwas könnte ausreichen:
#if (AAA < SOMETHING) && (AAA > SOMETHING_ELSE)
#error AAA is bad.
#endif
Ich denke, das ist detailliert genug für den Programmierer. Wenn Sie jedoch wirklich mehr Details wünschen und Sie einen modernen C-Compiler haben, können Sie static_assert verwenden.Dann können Sie etwas in der Nähe erreichen, was Sie wollen:
#include <assert.h>
#define xstr(s) str(s)
#define str(s) #s
#define err_msg(x) #x " is " xstr(x)
#define AAA 17
static_assert(AAA != 17, err_msg(AAA));
dieses Makro Durcheinander sollte AAA drucken ist 17. Eine Erklärung darüber, wie diese Makros arbeiten können here finden.
Ich bin mir nicht sicher, ob static_assert in C99 oder C11 enthalten war, es ist sicherlich in C11. Möglicherweise müssen Sie eine GCC-Erweiterung verwenden, um sie zu aktivieren.
Nach der C-Norm von 1999, haben Sie nur '# error' für so etwas und es erweitert keine Makros, es druckt nur den Text buchstäblich und bewirkt, dass die Kompilierung stoppt. Was willst du damit erreichen? –
Ich habe eine Hierarchie von vielen Makefiles, die AAA auf verschiedene Arten definieren, abhängig von den Make-Zielparametern. Ich möchte überprüfen, ob die Definition für das Ziel korrekt ist. Und ich möchte nicht eine Liste von #if AAA = 1 erstellen ... #warning "ist 1" ... – elomage
Auch dies ist für die Embedded-Welt ohne Displays, so dass ich nicht einfach den Makrowert testen kann Hinzufügen von etwas wie printf (#AAA); und überprüfe es zur Laufzeit. – elomage