C-Präprozessor #if-Ausdruck

Lesezeit: 3 Minuten

Benutzeravatar von Rohit Jain
Rohit Jain

Ich bin etwas verwirrt über die Art des Ausdrucks, den wir mit dem #IF-Präprozessor in der C-Sprache verwenden können. Ich habe den folgenden Code versucht, und es funktioniert nicht. Bitte erklären und geben Sie Beispiele für Ausdrücke, die mit dem Präprozessor verwendet werden können.

#include<stdio.h>
#include<conio.h>
#include<stdlib.h>

int c=1;

#if c==1
    #define check(a) (a==1)?a:5
    #define TABLE_SIZE 100
#endif

int main()
{
    int a = 0, b;
    printf("a = %d\n", a);
    b = check(a);
    printf("a = %d %d\n", a, TABLE_SIZE);
    system("PAUSE");
    return 0;
}

  • Würde ein Exemplar des C-Standards oder ein gutes Buch nicht die Antwort liefern? Googlen Sie beispielsweise nach “N1570”, um eine kostenlose Kopie des neuesten Entwurfs für den C11-Standard zu finden.

    – gnasher729

    9. April 2014 um 10:00 Uhr

Der Präprozessor kann keine Variablen aus dem C-Programm in Ausdrücken verwenden – er kann nur auf Präprozessor-Makros reagieren. Also, wenn Sie versuchen, zu verwenden c im Präprozessor erhalten Sie nicht das, was Sie erwarten könnten.

Sie erhalten jedoch auch keinen Fehler, denn wenn der Präprozessor versucht, einen Bezeichner auszuwerten, der nicht als Makro definiert ist, behandelt er den Bezeichner so, als hätte er einen Wert von Null.

Wenn Sie also auf dieses Snippet klicken:

#if c==1
#define check(a) (a==1)?a:5
#define TABLE_SIZE 100
#endif

Der c vom Präprozessor verwendet hat nichts mit der Variablen zu tun c aus dem C-Programm. Der Präprozessor prüft, ob ein Makro für definiert ist c. Da dies nicht der Fall ist, wird der folgende Ausdruck ausgewertet:

#if 0==1

was natürlich falsch ist.

Da Sie die Variable anscheinend nicht verwenden c In Ihrem Programm können Sie Folgendes tun, um das Verhalten an das anzupassen, was Sie versuchen:

#define C 1

#if C==1
#define check(a) (a==1)?a:5
#define TABLE_SIZE 100
#endif

(Beachten Sie, dass ich auch den Makronamen in Großbuchstaben geschrieben habe, um der Konvention für Makronamen zu entsprechen.)

  • GCC und andere GCC-kompatible Compiler unterstützen die -Wundef Option zum Aktivieren von Warnungen, wenn Bezeichner in einem Präprozessorausdruck verwendet werden. Dies kann dazu beitragen, Unfälle mit dieser Präprozessorfunktion zu vermeiden.

    – jtchitty

    8. Juli 2020 um 16:34 Uhr


Der Präprozessor wird auf dem Text ausgeführt, bevor eine Kompilierung durchgeführt wird. Es weiß nicht, wie es C parsen soll. Was Sie wahrscheinlich stattdessen wollten int c=1; War

#define C 1

und der Test funktioniert so, wie Sie ihn hatten:

#if C == 1

Der Schlüssel hier ist, dass dies alles definiert ist Vor Kompilierzeit. Der Präprozessor kümmert sich nicht um C-Variablen und schon gar nicht um deren Werte.

Beachten Sie, dass die Konvention darin besteht, Präprozessor-Makronamen in definiert zu haben ALL_CAPS.

In deinem Beispiel c ist ein vom Compiler generiertes Symbol, c hat keinen Wert bis Laufzeitwährend Präprozessorausdrücke bei ausgewertet werden Bauzeit (in der Tat, wie der Name schon sagt, bevor der Compiler den Code verarbeitet), kann also nur mit Präprozessorsymbolen arbeiten, die Tun existieren zur Bauzeit.

Außerdem müssen solche Ausdrücke sein Zeitkonstanten kompilierenoder genauer gesagt Vorverarbeitungszeit konstantda Compiler-Konstantenausdrücke wie z sizeof(...) werden beispielsweise auch nicht während der Vorverarbeitung definiert.

Benutzeravatar von Dave Rager
David Rager

Der Präprozessor wertet keine C-Variablen aus. Es “vorverarbeitet” den Quellcode, bevor er kompiliert wird, und hat somit eine eigene Sprache. Tun Sie stattdessen Folgendes:

#define c 1

#if c==1
#define check(a) (a==1)?a:5
#define TABLE_SIZE 100
#endif
...

1443890cookie-checkC-Präprozessor #if-Ausdruck

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

Privacy policy