Ошибка вставки “” HELLO “” и “WORLD” “не дает действительного токена предварительной обработки

Это неисправный код

#include #define CAT_I(A, B) A ## B #define CAT(A, B) CAT_I(A,B) void main (void) { printf(CAT("HELLO","WORLD")); } 

Почему это дает эту ошибку? Как я могу это исправить?

РЕДАКТИРОВАТЬ

Это то, что я пытаюсь сделать

 #define TAG "TAG" #define PRE CAT(CAT("") #define POS CAT(CAT("") #define XML CAT(CAT(PRE,"XML SOMETHING"),POS) 

затем

 printf(XML); 

Результат ## должен быть единственным токеном, а "HELLO""WORLD" – это не один токен. Чтобы объединить строки, просто оставьте их рядом друг с другом:

 printf("HELLO" "WORLD"); 

Или измените свой макрос, чтобы удалить ## .

 #define CAT(A, B) AB 

Строковые литералы объединены вместе, когда между ними нет промежуточных жетонов.