Использование оператора ‘Charizing’ препроцессора MSVC в Clang

У меня есть следующий код, который мне дал кто-то, работающий над MSVC:

#define MAP1(x, y) map[#x] = #@y;

Я нахожусь на XCode, использую Clang, и из различных поисков Google я обнаружил, что это известно как «оператор тарификации» и является специфическим для препроцессора MSVC. Есть ли способ эмулировать функциональность этого оператора при использовании Clang? Я пытался удалить @ но получил следующее сообщение об ошибке:

Assigning to 'int' from incompatible type 'const char[2]'

Будет ли работать явное приведение к типу int или оператор харизации делает что-то другое?

2

Решение

Струнизирующий оператор (стандарт C ++) конвертирует a в "a"так что оператор тарификации звучит так a в 'a', Вы можете, в простых случаях, получить 'a' от "a" взяв первого персонажа.

#define MAP1(x, y) map[#x] = static_cast<const char(&)[2]>(#y)[0];

static_cast в const char(&)[2] гарантирует, что вы получите ошибку во время компиляции, если вы не получите строку длины 1, то есть два символа, если вы посчитаете конечный '\0', Равнина #y[0] будет молча принимать первый символ, независимо от длины строки.

5

Другие решения

Вы пробовали что-то вроде #y [0]? По сути, «зачеркни y и возьми первый символ» 🙂

Кроме того, поскольку с виду все равно сгенерированные операторы выполняются во время выполнения, вы можете просто привести строку y в соответствие, передать ее функции и заставить эту функцию вернуть правильную вещь.

1

По вопросам рекламы [email protected]