Warum verwenden Benutzer #ifdef für Feature-Flag-Tests?
Menschenempfehlen#ifdef
für die bedingte Zusammenstellung mit großem Abstand. EINsuchen nach#ifdef
belegt, dass seine Verwendung allgegenwärtig ist.
Noch#ifdef NAME
(oder äquivalent#if defined(NAME)
und die damit verbundenen#ifndef NAME
(und#if !defined(NAME)
) einen schwerwiegenden Fehler haben:
#ifndef IS_SPECIAL
#error You're not special enough
#endif
source.cpp#include "header.h"
gcc -DIS_SPECIAL source.cpp
wird natürlich vergehen, wie es sein wird
source1.cpp#define IS_SPECIAL 1
#include "header.h"
Aber das wird es auch
source0.cpp#define IS_SPECIAL 0
#include "header.h"
was ganz falsch ist. Und einige C ++ - Compiler haben eine Datei übergeben, die in verarbeitet wurdeC Modus (aufgrund der Erweiterung oder Befehlszeilenoption) effektiv zu tun#define __cplusplus 0
. Ich habe gesehen, wie Dinge kaputt gingen
#ifdef __cplusplus
extern "C" {
#endif
/* ... */
#ifdef __cplusplus
}
#endif
wurde verarbeitet inC Modus, woextern "C"
ist eine ungültige Syntax, weil__cplusplus
wurde in der Tat automatisch definiert0
.
Auf der anderen Seite verhält sich dies für alle Compiler korrekt:
#if __cplusplus
extern "C" {
#endif
/* ... */
#if __cplusplus
}
#endif
Warum benutzen die Leute immer noch#ifdef
In diesem Szenario? Sind sie sich dessen einfach nicht bewusst?#if
funktioniert einwandfrei bei undefinierten Namen? Odergibt es einen tatsächlichen nachteil zu#if
vs#ifdef
zur bedingten Kompilierung?
Offensichtlich,#ifdef
Hat gültige Verwendungen, z. B. die Bereitstellung von Standardwerten für konfigurierbare Parameter:
#ifndef MAX_FILES
#define MAX_FILES 64
#endif
Ich diskutiere nur den Fall des Flaggentests.