Wie man einen Ausdruck in C stringt

8

Gibt es eine Möglichkeit, einen Ausdruck vor der Stringifizierung in c auszuwerten?

Beispiel:

%Vor%

Das Problem ist, dass ich

bekommen möchte %Vor%

Und nicht :

%Vor%

Kann das gemacht werden?

    
Andrew 13.08.2009, 22:34
quelle

7 Antworten

10

Der C-Präprozessor kann das nicht, also verwenden Sie stattdessen snprintf :

%Vor%

Verwendung

%Vor%

NB

Der Einfachheit halber habe ich die Fehlerkontrolle und free weggelassen.

    
dfa 13.08.2009, 22:45
quelle
5

Sie werden wahrscheinlich nicht das Format mögen, in dem der Ausdruck präsentiert wird, ja , es ist möglich, aber auf eine sehr vielseitige Weise - Sie ' d muss eine separate funktionale Sprache erstellen, die vom Präprozessor "ausgeführt" wird. Der Beweis:

%Vor%

In diesem Beispiel haben wir eine rein funktionale Preprocessor-Run-Sprache, die verwendet wird, um die 500. Fibonacci-Zahl zu berechnen und sie dann an den C-Compiler zu übergeben.

Natürlich bezweifle ich sehr, dass dies etwas ist, was Sie jemals in der Praxis anwenden würden, und es ist ein sehr weit gestreckter Missbrauch des Präprozessors, aber ich halte es für einen sehr nachdenklich stimmenden Hack. (Und ja, ohne die exotischen theoretischen Wendungen wie diese ist es nicht möglich).

    
Andrew Y 13.08.2009 23:31
quelle
3

Ich nehme an, dass Sie mehr Erfahrung in Skriptsprachen haben als in C.

Es gibt mehrere Phasen, die Sie mit einer rein kompilierten Sprache wie C: Preprocesing, Compiling, Linking und Running

beachten müssen

Zuerst wird der Präprozessor ausgeführt. Dort wird Ihr Makro erweitert. Zu diesem Zeitpunkt lautet der Inhalt "10 * 50". Daran lässt sich nicht viel ändern.

Nachdem der Makro-Preprozessor abgeschlossen ist, konvertiert der Compiler das Programm in eine Objektdatei

Nachdem der Compiler für jede Quelldatei fertig ist, tritt der Linker in sie ein und schlägt sie alle zusammen.

Schließlich, wenn Ihr Benutzer bereit ist, führen Sie Ihr Programm aus. Semantisch ist dies, wenn die 10 * 50 berechnet wird. (Tatsächlich werden die meisten Compiler erkennen, dass dies immer derselbe Wert ist, und er wird durch 500 ersetzt, aber das ist ein Implementierungsdetail).

Scripting-Sprachen mögen es, all diese Zeilen zu verwischen, damit ich sehen kann, wo jemand, der sich an eins gewöhnt hat, verwirrt sein könnte.

    
T.E.D. 13.08.2009 23:17
quelle
1

Präprozessor-Makros werden vor dem Compiler ausgeführt. Es ist per Definition nicht möglich, genau das zu tun, was Sie tun möchten.

Um eine Zahl zur Laufzeit in eine Zeichenkette umzuwandeln, rufen Sie die Funktion itoa wie folgt auf:

%Vor%

Beachten Sie, dass dieser Code thestring als Array und nicht als Zeiger deklariert. Weitere Informationen finden Sie unter Speicherverwaltung in C.

    
SLaks 13.08.2009 22:44
quelle
0

Sie müssen die Zeichenfolge interpretieren. C macht das nicht alleine, suchen Sie eine Bibliothek auf, die das für Sie erledigt.

Ссылка Ссылка

Es gibt andere, einfach google suchen.

    
Kristoffon 13.08.2009 22:42
quelle
-1

Sie könnten ein Skript (perl?) schreiben, das als Präprozessor verwendet werden soll. Es erkennt die auszuwertenden Zeichenfolgen, wertet sie aus und ruft dann die echte cpp-Datei in der "evaluated" -Datei auf.

Vielleicht könnte es funktionieren.

    
fnurglewitz 13.08.2009 23:30
quelle
-2

Wie die anderen Antworten gesagt haben, kann dies nicht mit dem C-Präprozessor durchgeführt werden. Dies ist eine der vielen Unzulänglichkeiten von C, die von C ++ gelöst werden. Dies ist die Art von Dingen, die auf sehr elegante Weise mit Template Metaprogramming erreicht werden kann.

Um einen arithmetischen Ausdruck zum Zeitpunkt der Kompilierung zu berechnen:

%Vor%

Hier ist eine Metafunktion für String-Formatierung , die ich in den Boost-Mailing-Listen-Archiven gefunden habe. Diese Version konvertiert ein int (wie das oben berechnete) in eine Zeichenkette in einer Basis Ihrer Wahl:

%Vor%

Setzen Sie die beiden zusammen Ihren Ausdruck wird:

%Vor%

... und das alles wird zu nichts anderem als einer konstanten Zeichenkette "500" zur Kompilierzeit: -)

    
David Claridge 14.08.2009 00:39
quelle

Tags und Links