Beim Erweitern eines Makros erweitert der Präprozessor die Argumente des Makros nur dann, wenn diese Argumente nicht den Operatoren stringizing ( #
) oder token-pasting ( ##
) unterworfen sind. Also, wenn du das hast:
Dann erweitert der Präprozessor nicht __LINE__
, weil es das Argument des stringizing-Operators ist. Wenn Sie dies jedoch tun:
Beim Erweitern von stringify
expandiert der Präprozessor __LINE__
auf die aktuelle Zeilennummer, da x
nicht mit den Stringing- oder Token-Pasting-Operatoren in der Definition von stringify
verwendet wird. Es erweitert dann stringify1
, und wir bekommen, was wir wollten.
Die relevante Sprache aus dem C99-Standard stammt aus §6.10.3.1 / 1:
Nachdem die Argumente für den Aufruf eines funktionsähnlichen Makros identifiziert wurden, findet eine Argumentsubstitution statt. Ein Parameter in der Ersetzungsliste wird, sofern nicht ein
#
oder##
Vorverarbeitungstoken oder gefolgt von einem##
Vorverarbeitungstoken (siehe unten) vorangestellt ist, durch das entsprechende Argument ersetzt, nachdem alle darin enthaltenen Makros expandiert wurden. Vor dem Ersetzen werden die Vorverarbeitungstoken jedes Arguments vollständig durch Makros ersetzt, als ob sie den Rest der Vorverarbeitungsdatei bilden würden. Es sind keine anderen Vorverarbeitungstoken verfügbar.
Die Klauseln §6.10.3.2 und 6.10.3.3 definieren das Verhalten der Operatoren #
bzw. ##
.