Was ist der genaue Schritt der Makroerweiterung?

8

Dies funktioniert nicht wie erwartet:

%Vor%

Das funktioniert:

%Vor%

Welche Priorität hat der Vorprozess, um solche Makros zu erweitern?

    
asker 19.07.2011, 05:05
quelle

1 Antwort

13

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:

%Vor%

Dann erweitert der Präprozessor nicht __LINE__ , weil es das Argument des stringizing-Operators ist. Wenn Sie dies jedoch tun:

%Vor%

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. ## .

    
Adam Rosenfield 19.07.2011, 05:24
quelle

Tags und Links