У меня есть следующий код, который мне дал кто-то, работающий над MSVC:
#define MAP1(x, y) map[#x] = #@y;
Я нахожусь на XCode, использую Clang, и из различных поисков Google я обнаружил, что это известно как «оператор тарификации» и является специфическим для препроцессора MSVC. Есть ли способ эмулировать функциональность этого оператора при использовании Clang? Я пытался удалить @
но получил следующее сообщение об ошибке:
Assigning to 'int' from incompatible type 'const char[2]'
Будет ли работать явное приведение к типу int или оператор харизации делает что-то другое?
Струнизирующий оператор (стандарт 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]
будет молча принимать первый символ, независимо от длины строки.
Вы пробовали что-то вроде #y [0]? По сути, «зачеркни y и возьми первый символ» 🙂
Кроме того, поскольку с виду все равно сгенерированные операторы выполняются во время выполнения, вы можете просто привести строку y в соответствие, передать ее функции и заставить эту функцию вернуть правильную вещь.