Gå til innhold

Preprocessor-spørsmål .. nasty stuff


Anbefalte innlegg

#define CREATE_PATH(path, file) #path "/" #file
CREATE_PATH(somepath, somefile.cpp)

 

Kjører jeg dette igjennom preprosessoren (cpp i mitt tilfelle) får jeg ut: "somepath" "/" "somefile.cpp"

..noe som er o.k. for kompileren; string-litterals blir kombinert automatisk, så saken ovenfor tilsvarer "somepath/somefile.cpp" for den.

 

Men for videre bruk i preprocessoren er det ubrukelig - for eksempel her:

#include CREATE_PATH(somepath, somefile.cpp)

 

Noen forslag?

 

Vær så snill -- ikke spør "hvorfor i helvette jeg vil gjøre dette?!?!?!" .. om noen lurer veldig så kan jeg forklare hvorfor etterpå, da jeg ikke har tid nå.

Lenke til kommentar
Videoannonse
Annonse

jeg lurer veldig på hvorfor i helvete du har lyst til å gjøre det der

uansett, jeg mener å huske å ha sett en lang diskusjon om det der før, at folk ville blande #include med sine egne makroer, og hvis jeg husker riktig, så kom man fram til at det ikke gikk så bra

Lenke til kommentar

Mulig jeg har misforstått, men du ønsker følgende output fra makroen din:

 

"somepath/somefile.cpp"

 

..eller?

 

Hvis det er slik skal følgende fungere:

 

#define _CREATE_PATH_HELPER(x) #x
#define CREATE_PATH(path, file) _CREATE_PATH_HELPER(path/file)

#include CREATE_PATH(somepath,somefile.cpp)

 

Fungerer i vc++ (testet med 7.1) og gcc. Merk at gcc ikke takler å ha space mellom komma og somefile.cpp.

Endret av kjetil7
Lenke til kommentar

Takker-å-bukker, Kjetil7 .. den fungerte utmerket. Er heldigvis sjeldent jeg surrer med dette, men uheldigvis blir det da vanskelig når man først må surre med det.

 

Her er et utdrag av sammenhengen dette blir tatt i bruk i:

 

#define M_strx(x) #x

#define M_expand(x) x

#define M_createPath(path, file) M_strx(path/file)

 

 

// Inline handling.

#undef M_inline

#if defined(M_win32) && defined(M_use_inline)

  #undef M_use_inline

  #define M_inline inline

  #include M_createPath(win32,M_expand(M_definition))

#elif defined(M_wince) && defined(M_use_inline)

  #undef M_use_inline

  #define M_inline inline

  #include M_createPath(wince,M_expand(M_definition))

#elif defined(M_linux) && defined(M_use_inline)

  #undef M_use_inline

  #define M_inline inline

  #include M_createPath(linux,M_expand(M_definition))

#else

  #define M_inline

#endif

 

#undef M_definition

 

(M_win32, M_wince eller M_linux blir satt av build-systemet)

 

class A {

public:

void a();

};

 

#define M_definition some-library.cpp

#include "macro_cleanup.hpp"

 

M_inline void A::a()

{

}

 

M_inline void A::a()

{

}

 

M_inline void A::a()

{

}

 

o.s.v.

 

#define M_use_inline

#include "some-library.hpp"

 

int main()

{

  A a;

  a.a();

  return(0);

}

 

g++ -D M_linux -I. -g -O2 program1.cpp -o program1

==> ok (og en disassembler bekrefter at ting har skjedd)

 

#include "some-library.hpp"

 

int main()

{

  A a;

  a.a();

  return(0);

}

 

g++ -D M_linux -I. -g -O2 program2.cpp -o program2

==> feiler:

/tmp/ccfukjD3.o(.text+0x14): In function `main':

/home/lars/tests/program2.cpp:13: undefined reference to `A::a()'

 

Kjempemessig -- her må man linke med biblioteket, som forventet.

 

Igjen .. takker :]

Endret av søppel
Lenke til kommentar

Opprett en konto eller logg inn for å kommentere

Du må være et medlem for å kunne skrive en kommentar

Opprett konto

Det er enkelt å melde seg inn for å starte en ny konto!

Start en konto

Logg inn

Har du allerede en konto? Logg inn her.

Logg inn nå
  • Hvem er aktive   0 medlemmer

    • Ingen innloggede medlemmer aktive
×
×
  • Opprett ny...