Как добавить пробел в макрос препроцессора concat? - PullRequest
0 голосов
/ 28 сентября 2018

Учитывая ниже, как я могу получить что-то, что дает ONE TWO THREE?Я не могу понять, что положить в ??, чтобы получить предполагаемое поведение concat.Вы не можете #define один пробел.

#include <iostream>
#define STRINGIFY(x) #x
#define STRINGIFYMACRO(y) STRINGIFY(y)

#define CONCAT2(X,Y) X ##  Y
#define CONCAT(X,Y) CONCAT2(X,Y)

#define CAT \
ONE     \
TWO


#define DOG \
THREE

#define BAT CONCAT(CONCAT(CAT,?? ),DOG)

int main()
{
    std::cout << STRINGIFYMACRO(BAT) << std::endl;
    return 0;
}

1 Ответ

0 голосов
/ 30 сентября 2018

Оператор ## используется для объединения двух последовательных токенов .Он не может использоваться для комбинированных вещей, которые не являются токенами (например, пробелами), и не может использоваться, если результат не является действительным токеном (предварительной обработки).

Другими словами, неиспользуйте ## для объединения строк .Это не то, для чего он нужен, и он не будет работать.

Помните, что в 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

Попробуйте онлайн!

...