/ Forside / Teknologi / Udvikling / C/C++ / Nyhedsindlæg
Login
Glemt dit kodeord?
Brugernavn

Kodeord


Reklame
Top 10 brugere
C/C++
#NavnPoint
BertelBra.. 2425
pmbruun 695
Master_of.. 501
jdjespers.. 500
kyllekylle 500
Bech_bb 500
scootergr.. 300
gibson 300
molokyle 287
10  strarup 270
Præprocessor magi
Fra : Søren Hansen


Dato : 27-10-04 23:44

Hejsa.

Jeg skal bruge lidt hjælp til lidt præprocssormagi..

Jeg her en stak data, jeg vil ha' tryllet om til enums og nogle
tilsvarende *char[]-ting.

Det nemmeste er nok et eksempel..

Jeg har en fil, der hedder enum.def. Den indeholder fx.:
ENUM(MMS_HEADER,
   ITEM(BCC, "Bcc")
   ITEM(CC, "Cc")
   ITEM(CONTENT_LOCATION, "Content-location")
   ITEM(CONTENT_TYPE, "Content-type")
   ITEM(DATE, "Date")
)

Det, det gerne skulle resultere i, er:
enum {
   MMS_HEADER_BCC,
   MMS_HEADER_CC,
   MMS_HEADER_CONTENT_LOCATION,
   MMS_HEADER_CONTENT_TYPE,
   MMS_HEADER_DATE,
} MMS_HEADER_enum;

*char MMS_HEADER_strings[] = {
   "Bcc",
   "Cc",
   "Content-location",
   "Content-type",
   "Date",
};


Sidste nævnte er simpel nok, men jeg kan simpelthen ikke få den øverste
til at virke. Koden til den ser sådan ud lige nu:
#define ENUM(enumname, data) enum { data } enumname##_enum;
#define ITEM(name, text) name,
#include "enum.def"


Hvis jeg bare kunne få min ENUM-makrofunktion til at definere en
konstant, der havde værdien af enumname, så kunne jeg bruge den i min
ITEM-makrofuntkion, men jeg kan simpelthen ikke få det til at spille.

Gode forslag?

--
Salu2, Søren.



 
 
Richard Flamsholt (28-10-2004)
Kommentar
Fra : Richard Flamsholt


Dato : 28-10-04 20:10

Søren Hansen <sh@warma.dk> skrev:
>Jeg har en fil, der hedder enum.def. Den indeholder fx.:
>ENUM(MMS_HEADER,
>   ITEM(BCC, "Bcc")
>   ITEM(CC, "Cc")
>   ITEM(CONTENT_LOCATION, "Content-location")
>   ITEM(CONTENT_TYPE, "Content-type")
>   ITEM(DATE, "Date")
>)

Skidt ide. Macroer kan ikke tage et variabelt antal argumenter. Fjern
den første og sidste linie så der bare står ITEM()'erne.

>Det, det gerne skulle resultere i, er:
>enum {
>   MMS_HEADER_BCC,
>   MMS_HEADER_CC,
>   MMS_HEADER_CONTENT_LOCATION,
>   MMS_HEADER_CONTENT_TYPE,
>   MMS_HEADER_DATE,
>} MMS_HEADER_enum;
>
>*char MMS_HEADER_strings[] = {
>   "Bcc",
>   "Cc",
>   "Content-location",
>   "Content-type",
>   "Date",
>};



>Sidste nævnte er simpel nok, men jeg kan simpelthen ikke få den øverste
>til at virke. Koden til den ser sådan ud lige nu:
>#define ENUM(enumname, data) enum { data } enumname##_enum;
>#define ITEM(name, text) name,
>#include "enum.def"

Det går helt i fisk. Forklaringen er, at en macro ikke ekspanderes til
yderligere en macro, så din ENUM ekspanderes til noget, der er fuld af
ITEM-tekster. Det kan ingen magi ændre på.

Du bliver derfor nødt til at inkludere filen to gange:

#define ITEM(name,data) MM_HEADER_ ## name,
enum {
#include "enum.def"
};
#undef ITEM
#define ITEM(name,data) data,
char *MM_HEADER_strings[] = {
#include "enum.def"
};
#undef ITEM

Hvis du kikker på koden ovenover siger du sikkert "nååh, ja"

--
Richard Flamsholt
richard@flamsholt.dk - www.richard.flamsholt.dk

Richard Flamsholt (28-10-2004)
Kommentar
Fra : Richard Flamsholt


Dato : 28-10-04 20:34

Richard Flamsholt <richard@flamsholt.dk> skrev:
>Skidt ide. Macroer kan ikke tage et variabelt antal argumenter.

Bagefter slog det mig pludselig, at så ville din kode jo slet ikke have
kunnet compilere. Så jeg tjekkede din macro igen og opdagede, at der jo
kun var to argumenter. D'oh!

--
Richard Flamsholt
richard@flamsholt.dk - www.richard.flamsholt.dk

Søren Hansen (01-11-2004)
Kommentar
Fra : Søren Hansen


Dato : 01-11-04 09:29

On Thu, 28 Oct 2004 21:10:12 +0200, Richard Flamsholt wrote:
>>Jeg har en fil, der hedder enum.def. Den indeholder fx.:
>>ENUM(MMS_HEADER,
>>   ITEM(BCC, "Bcc")
>>   ITEM(CC, "Cc")
>>   ITEM(CONTENT_LOCATION, "Content-location")
>>   ITEM(CONTENT_TYPE, "Content-type")
>>   ITEM(DATE, "Date")
>>)
> Skidt ide. Macroer kan ikke tage et variabelt antal argumenter.

Tjoh, det kan de ret beset godt:
#define   DEBUG(x...)    fprintf(stderr, ##x);

Man kan dog ikke benytte argumenterne enkeltvis.

Når det er sagt, så - som du også selv har opdaget - er der ikke komma
imellem mine ITEMs, så de tæller som et enkelt argument.

> Du bliver derfor nødt til at inkludere filen to gange:
>
> #define ITEM(name,data) MM_HEADER_ ## name,

Det er nok nødvendigt at nævne, at jeg har en bunke forskellige ENUMs.
Det er derfor, jeg ikke bare kan gøre det sådan.

--
Salu2, Søren.

Per Abrahamsen (02-11-2004)
Kommentar
Fra : Per Abrahamsen


Dato : 02-11-04 10:02

Søren Hansen <sh@warma.dk> writes:

> Gode forslag?

Jeg tror egentlig jeg ville skrive et lille (C eller C++) program til
at generere koden med. Resultatet vil være mere læseligt end
præprocessor magi.

Søg
Reklame
Statistik
Spørgsmål : 177558
Tips : 31968
Nyheder : 719565
Indlæg : 6408914
Brugere : 218888

Månedens bedste
Årets bedste
Sidste års bedste