6 Stimmen

Wie funktioniert dieser C-Code?

Was ist a##b & #a ?

  #define f(a,b) a##b
  #define g(a)   #a
  #define h(a) g(a)

  main()
  {
          printf("%s\n",h(f(1,2)));  //how should I interpret this?? [line 1]
          printf("%s\n",g(f(1,2)));  //and this? [line 2]
  }

Wie funktioniert dieses Programm?


Die Ausgabe lautet

12
f(1, 2)

jetzt verstehe ich, wie a##b & #a Arbeit. Aber warum ist das Ergebnis in den beiden Fällen (Zeile 1 und Zeile 2) unterschiedlich?

19voto

Wernsey Punkte 5342

Das ## verkettet zwei Token miteinander. Es kann nur im Präprozessor verwendet werden.

f(1,2) wird 1 ## 2 wird 12 .

Der Operator # allein stringiert Spielsteine: #a wird "a" . Deshalb, g(f(1,2)) wird "f(1,2)" wenn der Präprozessor mit ihm fertig ist.

h(f(1,2)) ist tatsächlich #(1 ## 2) die zu #12 die zu "12" wenn der Präprozessor darüber läuft.

5voto

unwind Punkte 377331

Bei Fragen wie diesen (und auch bei eher "realen" Problemen, die mit dem Präprozessor zu tun haben), finde ich es sehr hilfreich, den Code tatsächlich zu lesen, nach es wurde vorverarbeitet.

Wie man das macht, hängt vom jeweiligen Compiler ab, aber mit gcc würde man dies verwenden:

$ gcc -E test.c

(snip)
main()
{
        printf("%s\n","12");
        printf("%s\n","f(1,2)");
}

Sie sehen also, dass die Symbole sowohl verkettet als auch in eine Zeichenkette umgewandelt wurden.

4voto

Andrew Keith Punkte 7362

A##b fügt den Code zusammen.

f(1,2) wird also zu 12

3voto

Paul Hsieh Punkte 1456

Das Makro f(a,b) verkettet seine Argumente, g(a) verwandelt seine Argumente in eine Zeichenkette und h(a) ist ein Hilfsmakro für g(a). Ich denke, es wird ausgegeben:

12
f(1,2)

Der Grund dafür ist, dass das Makro h(a) sein Argument vollständig expandiert, bevor es an g(a) übergeben wird, während g(a) seine Argumente wörtlich nimmt, ohne sie vorher zu expandieren.

0voto

rossoft Punkte 2154

A##b ist die Aneinanderreihung der Literale a und b, also ist f(1,2) "12".

a ist das Zeichenfolgenliteral a, also ist g(3) "3".

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X