Sto lavorando a un progetto in cui ho molte stringhe costanti formate da concatenazione (numeri, ecc.).Come convertire stringhe concatenate in wide-char con il preprocessore C?
Ad esempio, ho una macro LOCATION
che formatta __FILE__
e __LINE__
in una stringa che posso usare per sapere dove mi trovo nel codice, quando si stampano messaggi o errori:
#define _STR(x) # x
#define STR(x) _STR(x)
#define LOCATION __FILE__ "(" STR(__LINE__) ")"
Quindi, questo sarebbe formattare una posizione come "file.cpp (42)". Il problema è quando si tenta di convertire il risultato a un livello di stringa:
#define _WIDEN(x) L ## x
#define WIDEN(x) _WIDEN(x)
#define WLOCATION WIDEN(LOCATION)
Questo funziona bene con GCC, e si traduce in L "file.cpp (42)" viene inserito nel mio codice. Tuttavia, quando si cerca questo con MSVC++ (utilizzando Visual C++ 2008 Express), ottengo un errore:
error: Concatenating wide "file.cpp" with narrow "("
Capisco che il prefisso L
viene aggiunto solo per il primo termine nella mia espressione. Ho anche provato questo:
#define _WIDEN(x) L ## #x
Quali "opere", ma dà la stringa L"\"file.cpp\" \"(\" \"42\" \")\""
che ovviamente non è molto conveniente (e non quello che sto cercando), soprattutto considerando che questa macro è semplice rispetto ad altri macro.
Quindi, la mia domanda è: come posso farlo applicare all'intera espressione in MSVC++, così posso ottenere lo stesso risultato che ottengo con GCC? Preferirei non creare una seconda stringa con token all-wide, perché dovrei quindi mantenere due macro per ognuno, il che non è molto conveniente e può portare a bug. Inoltre, ho bisogno anche della versione ridotta di ogni stringa, sfortunatamente non è possibile utilizzare stringhe all-wide.
Funziona, anche se è una specie di sintassi scomoda e ha un sacco di spese generali ... ma funziona e non devo mantenere più macro. Eventualmente, Microsoft aggiornerà il suo preprocessore per supportare più funzionalità C99, le cose sarebbero molto più semplici in questo modo. Grazie! –