|
| 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.
| |
|
|