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).
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üssenZuerst 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.
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:
Beachten Sie, dass dieser Code thestring
als Array und nicht als Zeiger deklariert. Weitere Informationen finden Sie unter Speicherverwaltung in C.
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.
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: -)
Tags und Links c