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:

header.h
#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.

Antworten auf die Frage(2)

Ihre Antwort auf die Frage