Оператор ##
используется для объединения двух последовательных токенов .Он не может использоваться для комбинированных вещей, которые не являются токенами (например, пробелами), и не может использоваться, если результат не является действительным токеном (предварительной обработки).
Другими словами, неиспользуйте ##
для объединения строк .Это не то, для чего он нужен, и он не будет работать.
Помните, что в C ++ последовательные строки будут объединяться компилятором.Таким образом, обычно нет необходимости объединять содержимое строки.Даже если вам нужно было объединить содержимое, вы можете сделать это без объединения токенов, потому что содержимое строки не является токеном.(Это необходимо только в том случае, если вы пытаетесь создать вычисленное #include
имя файла из нескольких компонентов.)
Еще одна полезная вещь, которую нужно знать, это то, что пробел внутри замены макроса (а не на обоих концах) сокращается доодин пробел, который сохраняется оператором stringify.
Так что, если вы согласны с одним пробелом, вы можете просто сделать это:
#include <iostream.h>
#define STRINGIFY(x) #x
#define STRINGIFY_EXPANDED(x) STRINGIFY(x)
#define CAT ONE TWO
#define DOG THREE
#define BAT CAT DOG
int main() {
std::cout << STRINGIFY_EXPANDED(BAT) << '\n';
return 0;
}
Попробуйтеэто онлайн!
В противном случае, вы можете разбить на части и объединить фрагменты по желанию:
#define DOG STRINGIFY(ONE) " " STRINGIFY(TWO)
#define CAT STRINGIFY(THREE)
#define BAT DOG "\t" CAT
Попробуйте онлайн!