Interpretation von Zeichenketten
-
eine andere Möglichkeit würde so in die Richtung gehen
dann kannst da drüber loopen und den Eintrag suchen der
passt.#define makeEntry(x) {#x,x} typedef struct MYConstants{ char *name; int data; }myConstants; myConstants konst[] = { makeEntry(first_constant) ,makeEntry(second_constant) ,makeEntry(x) ,makeEntry(x) ,makeEntry(x) };
dass passt natürlich auch super in ne hashmap, also string rein zahl raus.
aber normal hat man nicht so mega viele konstanten oder?lg
-
Ich spiel mal n bisschen.mit deinen Ansaetzen...
Melde mich wieder.
Danke
-
Ok, folgendes funktioniert
#define first_constant 1 #define secon_constant 2 #define get_const(x) x##_constant int main(void) { return get_const(first); /* Returniert mit 1 */ }
Aber 2 Probleme bleiben bestehen.
1. Die Uebergabe als Zeichenkette funktioniert nicht (get_const("first"))
Wie also variable Argumente uebergeben?2. Ich bin auf das Suffix '_constant' angewiesen. Was aber machen bei Konstanten
mit einem anderen oder gar keinem Suffix?Irgendwie muesste man das doch dem Praeprozessor beibringen koennen, oder?
Danke
-
#define get_const(x) x"_constant"
hilft evtl. und natürlich
-
"Irgendwie muesste man das doch dem Praeprozessor beibringen koennen, oder?"
evtl. solltest dir mal m4 anschauen denk da ist sowas möglich
-
Ja, an M4 dachte ich auch schon.
wikipedia, c in a nutshell und aehnliches liefert nichts akzeptables.Naja, mal sehen...
Danke
-
Ach bezueglich deiner Frage mit den Konstanten..
Doch es sind ne Menge. Es werden mehrere Header-Files inkludiert und dessen
Funtionsdeklarationen, defines... in den Namensraum der Perl-Anwendung exportiert.Danke
-
Nun ja, ziemlich simpel aber effektiv:
#include <stdio.h> #define first_constant 1 #define constant_first 2 #define first 3 #define get_const(x, y) x##y int main(void) { int x = get_const(first, _constant); int y = get_const(constant, _first); int z = get_const(first, ); printf("[%d, %d, %d]\n", x, y, z); return 0; }
So klappts auch mit dem Praeprocessor
Danke
-
hi,
ich würd eher dass zweite argument in das macro mit rein bringen, sonst mußt es
ja wieder für jede konstante dazu schreiben.#include <stdio.h> #define first_constant 1 #define constant_first 2 #define first 3 #define _constant #define _first #define get_const_c(x) x##_constant #define get_const_f(x) x##_first #define get_const(x) x int main(void) { int x = get_const_c(first); int y = get_const_f(constant); int z = get_const(first); printf("[%d, %d, %d]\n", x, y, z); return 0; }
-
Nein, nein. Das zweite Argument
fuer die Praeprozessordirektive
get_const(x, y) x##y
ist optional. Alternativ koennte ich also auch folgendes coden:
#include <stdio.h> #define first_constant 1 #define constant_first 2 #define first 3 #define get_const(x, y) x##y int main(void) { int x = get_const(first_constant, ); int y = get_const(constant_first, ); int z = get_const(first, ); printf("[%d, %d, %d]\n", x, y, z); return 0; }
Bei einer Definition wie der folgenden
#define get_const(x, y) x##
meckert der Compiler bzw. Praeprozessor
error: '##' cannot appear at either end of a macro expansionEs wird also hinter der Rautesequenz noch etwas erwartet soetwas wie '_constant'
oder '_first' wie du auch geschrieben hast.Etwas wie
#define get_const(x) x##""
funtioniert auch nicht da die Substitution nichts mit Strings zutun hat.
Danke
-
Das hab ich vergessen zu schreiben.
Bei deiner Version wuerd ich mich wieder vom Suffix abhaengig machen (_constant && _first) und genau das moechte ich vermeiden.
Danke
-
sowas hätt ich evtl noch im angebot
#define get_const(x) x #include "x.h" #undef get_const #define get_const(x) x##_constant #include "x_constant.h" #undef get_const #define get_const(x) x##_first #include "x_first.h" #undef get_const
-
Wie schon erwaehnt, wuerde ich mich bei einem Ansatz wie
#define get_const_c(x) x##_constant #define get_const_f(x) x##_first
abhaengig von den Namensgebungen der Ersatztexte machen.
Die beiden defines
#define _constant #define _first
sind optional.
Ein einfaches
#define get_const(x) x
ist schon ausreichend wie auch
#define get_const(x, y) x##y
Die beiden bringen das gewuenschte Ergebnis!
Deiner letzter Post
#define get_const(x) x #include "x.h" #undef get_const #define get_const(x) x##_constant #include "x_constant.h" #undef get_const #define get_const(x) x##_first #include "x_first.h" #undef get_const
duerfte nicht funktionieren, da der PP ja deine get_const Makros 'undefiniert' bevor das Programm kompiliert wird, folglich duerfte ein Aufruf von get_const innerhalb von z.B. main() ins leere fuehren oder taeusch ich mich da?
Danke
-
folglich duerfte ein Aufruf von get_const innerhalb von z.B. main() ins leere
fuehren oder taeusch ich mich da?also eigentlich kann man in keinem fall was aufrufen, die makros sind nur für den
preprocessor und sind im fertigen programm nicht mehr sichtbar. Um im source code
klarzumachen was ein macro und was eine function ist werden macros normal groß
geschrieben.der gedanke bei folgendem snippet ist, das macro neu zu definieren, und die
konstanten mit gleichem suffix zu gruppieren. die macros werden eigentlich,
in der reihenfolge abgearbeitet was bedeutet:#define get_const(x) x //ab jetzt wird jedes vorkommen von get_const(x) //durch x ersetzt #undef get_const //ab jetzt meldet jedes vorkommen von get_const //einen fehler #define get_const(x) x##_constant //ab jetzt wird jedes vorkommen von get_const(x) //durch x##_constant ersetzt #undef get_const //ab jetzt meldet jedes vorkommen von get_const //einen fehler #define get_const(x) x##_first //ab jetzt wird jedes vorkommen von get_const(x) //durch x##_first ersetzt #undef get_const //ab jetzt meldet jedes vorkommen von get_const //einen fehler
ob es undefiniert wird, spielt für bereits ersetzte text stellen keine rolle.
da die macros zur laufzeit nichtmehr verfügbar sind war die überlegung wie in
folgendem post die konstanten zur laufzeit verfügbar zu machen.#define makeEntry(x) {#x,x} typedef struct MYConstants{ char *name; int data; }myConstants; myConstants konst[] = { makeEntry(first_constant) ,makeEntry(second_constant) ,makeEntry(x) ,makeEntry(x) ,makeEntry(x) };
wirklich interresant ist eigentlich der punkt wo aus dem definierten namen
ein string wird und dass passiert://.- hier // v #define makeEntry(x) {#x,x}
-
Ah i.O., verstehe, so meinst du das.
Aber alles in allem kann das eigentliche Ausgangsproblem des Threads als _geloest_ betrachtet werden.
Danke nochmals fuer die Aufmerksamkeit