Вам не нужно такое решение для строковых литералов, так как они объединены на уровне языка, и это не сработает в любом случае, потому что "s" "1" не является допустимым токеном препроцессора. Однако для общего вставки токена попробуйте следующее:
/*
* Concatenate preprocessor tokens A and B without expanding macro definitions
* (however, if invoked from a macro, macro arguments are expanded).
*/
#define PPCAT_NX(A, B) A ## B
/*
* Concatenate preprocessor tokens A and B after macro-expanding them.
*/
#define PPCAT(A, B) PPCAT_NX(A, B)
Затем, например, PPCAT(s, 1)
создает идентификатор s1
.
Продолжаем тему следующих макросов:
/*
* Turn A into a string literal without expanding macro definitions
* (however, if invoked from a macro, macro arguments are expanded).
*/
#define STRINGIZE_NX(A) #A
/*
* Turn A into a string literal after macro-expanding it.
*/
#define STRINGIZE(A) STRINGIZE_NX(A)
Тогда
#define T1 s
#define T2 1
STRINGIZE(PPCAT(T1, T2)) // produces "s1"