2012-06-22 6 views
7

Dies ist der fehlerhafte CodeFehler Einfügen „“ hallo „“ und „“ WORLD „“ eine gültige Vorverarbeitung Token

#include<stdio.h> 

#define CAT_I(A, B)   A ## B 
#define CAT(A, B)   CAT_I(A,B) 

void main (void) 
{ 
     printf(CAT("HELLO","WORLD")); 
} 

Warum es nicht, dass Fehler gibt geben? Wie könnte ich es reparieren?

EDIT

Dies ist, was ich

#define TAG     "TAG" 
#define PRE     CAT(CAT("<",TAG),">") 
#define POS     CAT(CAT("</",TAG),">") 

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

dann

printf(XML); 

Antwort

8

Das Ergebnis ## muss ein einzelnes Token zu tun versuche, und "HELLO""WORLD" ist kein einziger Zeichen. Um Strings zu verketten, lassen Sie sie nebeneinander:

printf("HELLO" "WORLD"); 

Oder ändern Sie Ihr Makro das ## zu entfernen.

#define CAT(A, B) A B 

String-Literale werden miteinander verkettet, wenn zwischen ihnen keine dazwischenliegenden Token liegen.

+0

was bezeichnen Sie mit "einem einzelnen Token"? Wie kann ich eine Verkettung mit dem Präprozessor durchführen? – trucos

+1

@trucos: Lesen Sie den letzten Satz der Antwort. Hier ist wirklich kein Makro nötig. Der Compiler führt bereits eine Verkettung für Sie durch. – cHao

+1

Wenn ich kein Makro möchte, würde ich nicht fragen, meine Frage ist, wie man es mit einem Makro macht =). Vielleicht ist es nicht möglich – trucos