it-swarm.com.de

Warum #define anstelle einer Variablen verwenden?

Was ist der Sinn von #define in C++? Ich habe nur Beispiele gesehen, in denen es anstelle einer "magischen Zahl" verwendet wird, aber ich sehe keinen Sinn darin, diesen Wert stattdessen nur einer Variablen zu geben.

51
Greener

Meist stilistisch in diesen Tagen. Als C jung war, gab es keine konstante Variable. Wenn Sie also eine Variable anstelle eines #define, Sie hatten keine Garantie dafür, dass irgendjemand irgendwo den Wert nicht ändern würde, was in Ihrem gesamten Programm zu Chaos führte.

Früher hat FORTRAN sogar Konstanten als Referenz an Unterprogramme übergeben, und es war möglich (und kopfschmerzerregend), den Wert einer Konstanten wie '2' zu ändern, um etwas anderes zu sein. Dies geschah einmal in einem Programm, an dem ich arbeitete, und der einzige Hinweis, den wir hatten, dass etwas nicht stimmte, war, dass wir ein ABEND (abnormales Ende) bekamen, wenn das Programm das STOP 999 das sollte es normalerweise beenden.

41
Paul Tomblin

Das #define Ist Teil der Präprozessorsprache für C und C++. Wenn sie in Code verwendet werden, ersetzt der Compiler nur die Anweisung #define Durch eine beliebige Anweisung. Wenn Sie es beispielsweise satt haben, ständig for (int i=0; i<=10; i++) zu schreiben, können Sie Folgendes tun:

#define fori10 for (int i=0; i<=10; i++)

// some code...

fori10 {
    // do stuff to i
}

Wenn Sie etwas allgemeineres möchten, können Sie Präprozessor-Makros erstellen:

#define fori(x) for (int i=0; i<=x; i++)
// the x will be replaced by what ever is put into the parenthesis, such as
// 20 here
fori(20) {
    // do more stuff to i
}

Es ist auch sehr nützlich für die bedingte Kompilierung (die andere Hauptverwendung für #define), Wenn Sie nur bestimmten Code in einem bestimmten Build verwenden möchten:

// compile the following if debugging is turned on and defined
#ifdef DEBUG
// some code
#endif

Bei den meisten Compilern können Sie ein Makro über die Befehlszeile definieren (z. B. g++ -DDEBUG something.cpp), Aber Sie können auch einfach ein Define in Ihren Code einfügen, wie folgt:

#define DEBUG

Einige Ressourcen:

  1. Wikipedia-Artikel
  2. C++ - spezifische Site
  3. Dokumentation zum Präprozessor von GCC
  4. Microsoft-Referenz
  5. C-spezifische Site (Ich glaube nicht, dass es sich von der C++ - Version unterscheidet)
115
supercheetah

Einmal bekam ich Probleme bei der Arbeit. Mir wurde vorgeworfen, in Array-Deklarationen "magische Zahlen" zu verwenden.

So was:

int Marylyn[256], Ann[1024];

Die Firmenpolitik bestand darin, diese magischen Nummern zu vermeiden, da mir erklärt wurde, dass diese Nummern nicht tragbar waren; dass sie die einfache Wartung behinderten. Ich habe argumentiert, dass ich beim Lesen des Codes genau wissen möchte, wie groß das Array ist. Ich habe das Argument verloren und an einem Freitagnachmittag die beleidigenden "magischen Zahlen" durch #defines ersetzt:

 #define TWO_FIFTY_SIX 256
 #define TEN_TWENTY_FOUR 1024

 int Marylyn[TWO_FIFTY_SIX], Ann[TEN_TWENTY_FOUR];

Am folgenden Montagnachmittag wurde ich gerufen und passiver trotziger Tendenzen beschuldigt.

23
Harpee

#define kann einige Aufgaben erledigen, die in normalem C++ nicht möglich sind, z. B. das Verwalten von Headern und anderen Aufgaben. Es sollte jedoch definitiv nicht als magische Zahl verwendet werden - stattdessen sollte eine statische Konstante verwendet werden.

7
Puppy

C hatte früher keine Konstanten, daher waren #defines die einzige Möglichkeit, konstante Werte bereitzustellen. Sowohl C als auch C++ haben sie jetzt, so dass es keinen Sinn macht, sie zu verwenden, außer wenn sie mit # ifdef/ifndef getestet werden.

7

Die häufigste Verwendung (außer zum Deklarieren von Konstanten) ist include guard .

4
YXD

Define wird vor dem Kompilieren vom Preprozessor ausgewertet, während zur Laufzeit auf Variablen verwiesen wird. Dies bedeutet, dass Sie steuern, wie Ihre Anwendung erstellt wird (nicht, wie sie ausgeführt wird).

Hier sind einige Beispiele, die define verwenden, das nicht durch eine Variable ersetzt werden kann:

  1. #define min (i, j) ((i <j))? (i): (j))
    beachte, dass dies vom Preprozessor ausgewertet wird, nicht zur Laufzeit

  2. http://msdn.Microsoft.com/en-us/library/8fskxacy.aspx

1
DanJ

Das #define ermöglicht es Ihnen, einen Wert in einem Header festzulegen, der andernfalls zu einer Größe größer als Null kompiliert würde. Ihre Header sollten nicht größer als Null kompiliert werden.

// File:  MyFile.h

// This header will compile to size-zero.
#define TAX_RATE 0.625

// NO:  static const double TAX_RATE = 0.625;
// NO:  extern const double TAX_RATE;  // WHAT IS THE VALUE?

BEARBEITEN: Wie Neil im Kommentar zu diesem Beitrag betont, würde die explizite Definition mit Wert im Header für C++ funktionieren, nicht jedoch für C.

0
charley