Вы не можете этого сделать;последовательность замены макроса состоит из полных токенов.Макросы работают на уровне токенов, а не на уровне персонажей.Ваш пример содержит неопределенные строковые литеральные токены.
Существует оператор ##
, который можно использовать в последовательностях замены макросов для объединения токенов, но входные данные для ##
не могут быть фрагментами токена.
Однако в синтаксисе C смежные строковые литеральные токены объединяются в единый строковый литеральный объект.Например, "A" "B"
означает то же самое, что и "AB"
.
Таким образом, если мы позволим себе начать с токенов HELLO
и WORLD
в качестве входных данных, то мы создадим "HELLO WORLD\n"
, используямакрос, например:
#include <stdio.h>
#define XMAC(A, B) #A " " #B "\n"
#define MAC(A, B) XMAC(A, B)
#define TEST HELLO
#define TEST2 WORLD
int main(void)
{
printf("%s", MAC(TEST, TEST2));
return 0;
}
Когда дело доходит до препроцессора C, вам действительно нужно следить за своей главной целью (такой как достижение общего улучшения в организации программы) и быть готовым к корректировкедетали требований о том, как этого достичь, а не настаивать на каком-то очень специфическом подходе.