2009-11-06 3 views
2

У меня есть макрос для символьной строки следующим образом:Объединяя широкий строковый литерал шпагата макросъемки

#define APPNAME "MyApp" 

Теперь я хочу, чтобы построить широкую строку, используя эту макрокоманду, делая что-то вроде:

const wchar_t *AppProgID = APPNAME L".Document"; 

Однако это создает ошибку компиляции «конкатенации несогласованных строк».

Есть ли способ конвертировать макрос APPNAME в широкий строковый литерал?

+0

Примечание: C++ 0x имеет новый «делать правильные вещи» правило для этого случая. §2.14.5/13: «Если один строковый литерал не имеет префикса кодировки, он рассматривается как строковый литерал того же префикса кодировки, что и другой операнд». – Potatoswatter

ответ

7

ли вы попробовать

#define APPNAME "MyApp" 

#define WIDEN2(x) L ## x 
#define WIDEN(x) WIDEN2(x) 

const wchar_t *AppProgID = WIDEN(APPNAME) L".Document"; 
+0

Да, но мне было интересно, есть ли способ сделать это без необходимости определять две версии макроса (широкие и неширокие). – flashk

+0

Работает как очарование, спасибо! – flashk

+0

Я обновил свой ответ, чтобы использовать некоторые распространенные техники препроцессора для обработки строк. Вы можете увидеть более продвинутые способы использования, если заглянете на http://www.boost.org/doc/libs/1_40_0/libs/preprocessor/doc/index.html –