C препроцессор Literal Construction - программирование
Подтвердить что ты не робот

C препроцессор Literal Construction

Моя проблема такова:

У меня есть строковый литерал, который макроопределяется так

#define TITLE "Title"

Но есть примеры, когда мне нужно передать широкий вариант char этой строки. Я хочу передать L"Title" этим функциям. Поэтому, естественно, я попытался определить новый макрос W_TITLE в терминах TITLE.

Но мне не повезло, все мои подходы (перечисленные ниже) провалились. Скажите, пожалуйста, как можно достичь такой магии.

Я пробовал

#define W_TITLE L##TITLE
#define W_TITLE #L TITLE
#define W_TITLE ##L TITLE

Но все они терпят неудачу...

4b9b3361

Ответ 1

Попробуйте следующее:

#define WIDEN_(exp)   L##exp
#define WIDEN(exp)    WIDEN_(exp)
#define TITLE         "Title"
#define W_TITLE       WIDEN(TITLE)

Вам нужно принудительно расширить промежуточный макрос, чтобы получить то, что вы ищете.

#include <stdio.h>

#define WIDEN_(exp)   L##exp
#define WIDEN(exp)    WIDEN_(exp)
#define TITLE         "Title"
#define W_TITLE       WIDEN(TITLE)

int main(int argc, char *argv[])
{
    printf("%s\n", TITLE);
    wprintf(L"%ls\n", W_TITLE);
    return 0;
}

Результат:

Title
Title