#define ist eine Präprozessor-Direktive, die einfach alle Vorkommen des Identifikators vor der Kompilation durch den Wert ersetzt. Es erstellt keine Variablen, kennt keine Typen, überprüft keine Grenzen und beachtet die Sichtbarkeit nicht.
const ist ein Qualifikator, der eine echte Variable erstellt, die jedoch nach der Initialisierung für die Schreiboperation gesperrt ist. Die const-Variable hat einen Typ, eine Sichtbarkeit, nimmt an der Debugging-Session teil und kann sicherer sein. Solche Variablen werden im .rodata-Segment oder auf dem Stack/im RAM platziert.
#define — für einfache Skalarwerte, die zur Kompilierungszeit benötigt werden, insbesondere wenn sie in Präprozessorbedingungen oder Arraygrößen verwendet werden (#define SIZE 16).const — für Werte, die typensicher übergeben, debuggt und gleichzeitig sicher exportiert werden müssen (in Header-Dateien, zwischen Modulen).const zu verwenden.Beispiel:
#define PI 3.14159 const double G = 9.81; int arr[PI]; // FEHLER! PI ist kein Integer int arr2[G]; // FEHLER! G ist kein Wert zur Kompilierungszeit
Frage: Funktioniert const int a = 10; als Kompilierungszeitkonstante für die Erstellung eines Arrays: int arr[a];?
Antwort: Nein. In C ist const ein Qualifikator, aber die Variable wird zur Laufzeit und nicht zur Kompilierungszeit erstellt und initialisiert, daher muss die Größe des Arrays ein Literal oder ein Ausdruck sein, der dem Compiler bekannt ist. Verwenden Sie #define oder enum { SIZE = 10 };.
Beispiel für einen Fehler:
const int a = 5; int arr[a]; // Funktioniert nicht in C89/90 (VLAs wurden in C99 eingeführt, aber nicht überall)
Geschichte
Auf dem Media-Server versuchten sie,
const intzur Festlegung der Puffergrößen zu verwenden, in dem Glauben, dass es sich um eine "Kompilierzeit-Konstante" handelt. Auf einem Compiler (GCC, C99) funktionierte alles, aber auf den meisten trat ein Kompilierungsfehler auf (VLA werden nicht unterstützt), und sie mussten dringend auf#defineumschreiben.
Geschichte
Im plattformabhängigen Code definierten sie die Zeichenfolge über
#define NAME "MyApp", verwendeten sie an mehreren Stellen und vergaßen, sie in Klammern zu setzen. Nach dem Hinzufügen von Zeichen zur Zeichenfolge ohne explizite Klammern erhielten sie falsche Ergebnisse, die zu seltsamen Bugs in den Protokollen führten.
Geschichte
In einem Projekt mit mehreren Modulen definierten sie eine Konstante an zwei Stellen mit unterschiedlichen Werten über
#define(Copy-Paste). Das Ergebnis war, dass die Module mit verschiedenen Konstanten arbeiteten, und es gab Dateninkonsistenzen, die nur durch akribisches Debugging behoben wurden.