Präprozessor-Makros zählen

8

Ich habe diesen Makrocode, mit dem ich sowohl eine C Enumeration als auch eine Liste der enumerierten Namen als Strings unter Verwendung eines Konstrukts definieren kann. Es hindert mich daran, Aufzählernamen zu duplizieren (und möglicherweise Fehler für große Listen einzuführen).

%Vor%

dann:

%Vor%

sollte bei der Erweiterung Folgendes erzeugen:

%Vor%

In der Implementierungsdatei habe ich diesen Code:

%Vor%

, das bei der Erweiterung erzeugt:

%Vor%

Ich würde gerne wissen, wie viele Aufzählungselemente ich auf diese Weise erstellt habe und sie an Arrays zur Kompilierung weitergeben kann. Im obigen Beispiel würde dies bestimmen, dass TOTAL_ITEMS = N zur Kompilierzeit ist. Ist es möglich, Makroaufrufe auf diese Weise zu zählen?

Ich habe ein nicht standardmäßiges Makro COUNTER erwähnt, ähnlich wie die Makros FILE und LINE , aber ich hoffe Es gibt einen Standardweg.

Wäre auch daran interessiert zu hören, ob es einen besseren Weg gibt, dies zu erreichen, ohne Makros zu benutzen.

    
Eyal 28.12.2011, 23:22
quelle

5 Antworten

7

Folgendes sollte funktionieren:

%Vor%

Bearbeiten : Danke an Raymond Chen, dass wir uns keine Sorgen um das unnötige letzte Komma in der Liste machen müssen. (Ich hatte das Problem für Enums mit strikten C89-Compilern falsch verstanden, wie in Ist das letzte Komma in C enum erforderlich? . )

    
Joseph Quinsey 28.12.2011, 23:49
quelle
4

Sie können dieselbe Methode verwenden, um die Aufrufe zu zählen.

%Vor%     
Raymond Chen 28.12.2011 23:56
quelle
2
  

Wäre auch daran interessiert zu hören, ob es einen besseren Weg gibt, dies zu erreichen, ohne Makros zu benutzen.

Sie können immer eine Skriptsprache wie Ruby oder Python verwenden, um .c und .h Dateien für Sie zu generieren. Wenn Sie es gut machen, können Sie Ihr Skript in Ihr Makefile integrieren.

    
David Grayson 28.12.2011 23:33
quelle
1

Ich weiß, das ist keine vollständige Antwort. Sie können ein Makro um so etwas erstellen.

%Vor%

Wenn du deine enum so verändern kannst, dass sie kontinuierliche Elemente enthält, kannst du das so tun (von Boost)

%Vor%     
Alex 28.12.2011 23:50
quelle
0

Siehe die Vorschläge von Mu Dynamics "Enums, Strings und Faulheit" ; Diese beziehen sich zumindest auf das, wonach Sie suchen.

Schauen Sie sich andernfalls die Boost-Präprozessor-Sammlung an (die sowohl mit dem C-Präprozessor als auch mit dem C ++ - Präprozessor verwendet werden kann). .

    
Jonathan Leffler 28.12.2011 23:58
quelle

Tags und Links