Warum benötigt #define kein Semikolon?

Lesezeit: 4 Minuten

Benutzer-Avatar
Schasch

Ich habe einen Testcode geschrieben C. Aus Versehen hatte ich a eingefügt ; nach einer #define, was mir Fehler gab. Warum ist ein Semikolon nicht erforderlich für #defines?

Genauer :

Methode 1: funktioniert

const int MAX_STRING = 256;

int main(void) {
    char buffer[MAX_STRING];
}

Methode 2: Funktioniert nicht – Kompilierungsfehler.

#define MAX_STRING 256;

int main(void) {
    char buffer[MAX_STRING];
}

Was ist der Grund für das unterschiedliche Verhalten dieser Codes? Sind diese beiden MAX_STRINGs keine Konstanten?

  • Sehen Sie sich die Ausgabe des Präprozessors an und die Antwort wird Ihnen direkt ins Gesicht starren.

    – Michael Foukarakis

    7. November 2016 um 8:27 Uhr

  • @MichaelFoukarakis ja, es ist der einfachste Weg cpp prog_name.c | tail sag alles.

    – abrzozowski

    7. November 2016 um 8:48 Uhr


  • Trick: Kompilieren mit -E -dD Flaggen. -E Flag stoppt den Compiler nach Vorverarbeitungsphase (kompiliert nicht). -dD Flag weist den Präprozessor an, die Präprozessoranweisungen in der Datei zu belassen, obwohl ihre Verwendung weiterhin verarbeitet wird.

    – Jorge Bellon

    14. November 2016 um 17:02 Uhr

  • C hat keine symbolischen Konstanten (außer z Enum-Konstanten). const qualifiziert Variablen sind keine Konstanten in C. Und #defined-Namen sind auch keine Konstanten.

    – zu ehrlich für diese Seite

    15. November 2016 um 14:10 Uhr


Benutzer-Avatar
Xenteros

#define MAX_STRING 256;

meint:

Wann immer Sie MAX_STRING bei der Vorverarbeitung finden, ersetzen Sie es durch 256;. In Ihrem Fall wird es Methode 2 machen:

#include <stdio.h>
#include <stdlib.h>
#define MAX_STRING 256;

int main(void) {
    char buffer [256;];
}

was keine gültige Syntax ist. Ersetzen

#define MAX_STRING 256;

mit

#define MAX_STRING 256

Der Unterschied zwischen Ihren beiden Codes besteht darin, dass Sie in der ersten Methode eine Konstante gleich deklarieren 256 aber im zweiten Code definieren Sie MAX_STRING Für etwas stehen 256; in Ihrer Quelldatei.

Die Direktive #define wird verwendet, um Werte oder Makros zu definieren, die vom Präprozessor verwendet werden, um den Quellcode des Programms zu manipulieren, bevor er kompiliert wird. Da Präprozessordefinitionen ersetzt werden, bevor der Compiler auf den Quellcode einwirkt, sind alle Fehler, die durch #define eingeführt werden, schwer zu verfolgen.

Die Syntax lautet:

#define CONST_NAME VALUE

Wenn da ein … ist ; Am Ende wird es als Teil von betrachtet VALUE.

zu verstehen, wie genau #defines Arbeit, versuchen Sie zu definieren:

#define FOREVER for(;;)
...
    FOREVER {
         /perform something forever.
    }

Interessante Bemerkung von John Hascall:

Die meisten Compiler bieten Ihnen eine Möglichkeit, die Ausgabe nach der Präprozessorphase anzuzeigen. Dies kann bei der Fehlersuche wie dieser hilfreich sein.

Im gcc es kann mit flag gemacht werden -E.

  • Die meisten Compiler bieten Ihnen eine Möglichkeit, die Ausgabe nach der Präprozessorphase anzuzeigen. Dies kann bei der Fehlersuche wie dieser hilfreich sein.

    – John Hascall

    9. November 2016 um 19:04 Uhr

Benutzer-Avatar
Jon

#define ist ein Präprozessordirektivekein Aussage oder Erklärung wie von der C-Grammatik definiert (beide müssen mit einem Semikolon enden). Die Regeln für die Syntax von jedem sind unterschiedlich.

define ist eine Präprozessordirektive und ein einfacher Ersatz, es ist keine Deklaration.

Übrigens, als Ersatz kann es einige enthalten ; als Teil davon:

// Ugly as hell, but valid 
#define END_STATEMENT ;

int a = 1 END_STATEMENT // preprocessed to -> int a = 1;

Benutzer-Avatar
AnT steht zu Russland

Beide Konstanten? Nein.

Die erste Methode erzeugt kein a Konstante in C-Sprache. Konstantenqualifizierte Variablen gelten in C nicht als Konstanten. Ihre erste Methode funktioniert nur, weil Vergangenheit-C99 C Compiler unterstützen Arrays mit variabler Länge (VLA). Dein buffer Ein VLA liegt im ersten Fall speziell daran MAX_STRING ist nicht eine Konstante. Versuchen Sie, dasselbe Array im Dateibereich zu deklarieren, und Sie erhalten eine Fehlermeldung, da VLAs im Dateibereich nicht zulässig sind.

Die zweite Methode kann verwendet werden, um konstanten Werten in C Namen zuzuweisen, aber Sie müssen es richtig machen. Das ; in der Makrodefinition sollte nicht vorhanden sein. Makros funktionieren durch Textsubstitution und Sie möchten das nicht extra ersetzen ; in Ihre Array-Deklaration. Der richtige Weg, dieses Makro zu definieren, wäre

#define MAX_STRING 256

Wenn es darum geht, richtig benannte Konstanten zu definieren, sind Sie in der C-Sprache im Grunde auf Makros und Aufzählungen beschränkt. Versuchen Sie nicht, es zu benutzen const “Konstanten”, es sei denn, Sie wissen wirklich, dass es für Ihre Zwecke funktioniert.

Denn so wurde die Syntax für die festgelegt Precompiler-Direktiven.

Nur Aussagen enden mit a ; in c/c++, #define ist eine Präprozessordirektive und keine Anweisung.

Die zweite Version definiert keine sprachliche Konstante, sondern lediglich eine Substitutionsregel für einen Textblock. Einmal die Präprozessor hat seine Arbeit getan, die Compiler sieht

char buffer [256;];

was syntaktisch nicht gültig ist.

Die Moral von der Geschichte: lieber die const int MAX_STRING = 256; Weise, wie das Ihnen, dem Compiler und dem Debugger hilft.

Benutzer-Avatar
Donald Duck

Diese Präprozessordirektive:

#define MAX_STRING 256;

weist den Präprozessor an, alles zu ersetzen MAX_STRINGs mit 256; – und mit dem Semikolon. Präprozessoranweisungen benötigen kein Semikolon am Ende. Wenn Sie eines eingeben, denkt der Präprozessor tatsächlich, dass Sie es mit einem Semikolon meinen.

Wenn Sie verwirrt sind mit #defines für Konstanten, const int wäre wahrscheinlich einfacher nachzuvollziehen.

Wenn Sie mehr darüber erfahren möchten, wie Sie diese Präprozessordirektiven richtig verwenden, schauen Sie sich an Diese Internetseite.

  • Aber ein const int ist nicht eine Konstante in C.

    – Antti Haapala – Слава Україні

    26. Oktober 2019 um 17:46 Uhr

1227510cookie-checkWarum benötigt #define kein Semikolon?

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy