Различные правила строковой макросов в Clang и MSVC - PullRequest
0 голосов
/ 11 января 2019

Я обнаружил, что в MSVC и Clang существует различие в строковой макросов. Можно ли написать макрос строкового преобразования в Clang, который работает так же, как и строковый формат в MSVC?

#define __IN_QUOTES(str) #str
#define IN_QUOTES(str) __IN_QUOTES(str)

#define HELLO_WORLD Hello world

int main()
{
#ifdef _MSVC_LANG
    printf("%s", "MSVC\r\n");
#else
    printf("%s", "CLANG\r\n");
#endif
    printf("%s", IN_QUOTES(HELLO_WORLD));

    return 0;
}

Этот код работает одинаково как в Clang, так и в MSVC, но если я напишу строку 3 как

#define HELLO_WORLD Hello, world

он будет скомпилирован в MSVC (с «Hello, world») в выводе, но не скомпилирован в Clang с ошибкой «слишком много аргументов для вызова функции, подобного макросу». Вопрос в том, можно ли написать макрос IN_QUOTES, который мог бы создавать «Hello, world» как в Clang, так и в MSVC? Я пробовал

#define IN_QUOTES((str)) __IN_QUOTES(str)

Возвращает "(Hello, world)" в Clang и в MSVC, но для меня интересно получить его без скобок.

1 Ответ

0 голосов
/ 12 января 2019

Следующее верно и должно работать на любом совместимом компиляторе C99:

#define __IN_QUOTES(...) #__VA_ARGS__
#define IN_QUOTES(str) __IN_QUOTES(str)

Работает с версиями MSVC, которые я обнаружил в Compiler Explorer (а также с Clang и GCC).

Обратите внимание, что он не будет точно сохранять пробелы, но с этим ничего не поделаешь.

(Мне пришлось изменить #ifdef на #ifdef _MSC_VER; ни один из онлайн-компиляторов, которые я пробовал, похоже, не определил _MSVC_LANG.)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...