2012-06-27 15 views
9

ich zwei verschiedene Dinge in zwei bekannte Bücher in c gefunden haben, erste ist „Formal-Parameter werden in Anführungszeichen gesetzten String in Makroerweiterung nicht ersetzt“ - von K & R c Sprache Seite 76Makrovariablen innerhalb zitierte Zeichenfolge erweitert

zweite ist ein Code,

#define PRINT(var,format) printf("variable is %format\n",var) 
PRINT(x_var,f); 

später Makroaufruf würde als

erweitert werden
printf("x_var is %f\n",x_var); 
  • Dies wird durch Programmierung in ANSI C - E. Balagurusamy auf Seite 448.

Sicherlich zwei Zitierungen widerspruchs miteinander sind. Soweit ich weiß, ist das erste wahr und mein Compiler gibt mir das Ergebnis. Aber das zweite Buch ist auch bekannt und beliebt. Ich möchte wissen, ob es solche Dinge in früheren Versionen von c gab oder ob das zweite Zitat falsch ist.

+8

Es klingt, als müssten Sie eines dieser Bücher loswerden. Ich überlasse es Ihnen zu erraten, ob derjenige, der sich entledigt, derjenige ist, der den Erfinder der Sprache als Autor mit einschließt oder nicht. –

+0

Ich bevorzuge es, E.Balagurusamy etwas Kredit zu geben - vielleicht ist das Zitat ungenau? – ugoren

+0

Könnte nur ein Fehler beim Bearbeiten sein.Der Unterschied in der Buchgröße macht das leicht möglich: D – Banjocat

Antwort

17

Das zweite Buch ist falsch: it is easy to check, dass das Makro nicht so erweitert wird. Sie können jedoch die Wirkung erhalten, dass sie von Zeichenfolgen beschreiben Token mit dem # Präprozessor Operator:

#define PRINT(var,format) printf(#var" is %"#format"\n",var) 

Jetzt können Sie Ihre Variable wie folgt drucken:

int xyz = 123; 
PRINT(xyz, d); 

Hier ist a link to a working sample on ideone.

Beachten Sie das Hinzufügen der doppelten Anführungszeichen vor und nach dem '#format' und das '#' vor 'var' und 'format'. Der Operator '#' bewirkt, dass der Wert der Variablen in eine Zeichenfolge in Anführungszeichen gesetzt wird - mit eigenen Anführungszeichen. Dies macht die ersetzten Zeichenfolgen zu vier in Anführungszeichen gesetzten Strings in einer Zeile, die der C-Compiler als eine Anforderung zum Verketten zu einer Zeichenfolge erkennt. Daher sind die Zeichenfolgen: "xyz", "is%", "d" und "\ n" verkettet in: "xyz ist% d \ n"

(Dieses Beispiel unterscheidet sich von dem Beispiel in der ursprünglichen Frage Das ursprüngliche Beispiel hatte "Variable ist ...", wobei die Antwort "Variable" durch eine Instanz des Makroarguments "var" ersetzt hat.

+0

Dies funktioniert nicht mit einigen Formatierungszeichenfolgen wie "d" zum Einfügen von Kommas mit Gebietsschema. Ich musste das Makro wie folgt modifizieren: '#define PRINT (var, format) printf (#var": "format" \ n ", var)', dann im Code als 'PRINT (xyz, '%' d ");'. Dies erlaubte mir auch, das Format für mehrere Zeilen durch Leerzeichen vor dem Zeichen% zu ersetzen. – AaronCarson

1

Das Buch ist korrekt. Für es ist Zeit. Ich schrieb ein kleines Testprogramm um es zu überprüfen (Sie nicht Text-Editoren zu schätzen wissen, bis Sie in ed programmiert haben):

#define PRINT(fmt,val) printf("val = %fmt\n", (val)) 
main() 
{ 
    int x; 
    x = 5; 
    PRINT(d, x); 
} 

ich es auf einer PDP-11 mit Unix V6 zusammengestellt. Ausführen des Programms erzeugt diese Ausgabe:

x = 5 

Dies ist auch vor K & R C. Das „Feature“ wurde in einer der späteren Iterationen von C entfernt und offiziell gemacht in ISO C90.

Verwandte Themen