Frage

Update 3 :

Das macht nichts. Ich irgendwie bekam, was ich suchte. Im Folgenden werden eindeutige Kennungen innerhalb einer Klasse.

static const int _counter_start = __COUNTER__;
static const int val1 = __COUNTER__ - _counter_start;
static const int val2 = __COUNTER__ - _counter_start;

Update 2 :

Erhöhung Preprocessor

werde ich so etwas wie eine Nachricht Karte mit dieser Funktionalität implementieren.

class a
{
...
    MAP_BEGIN()
    MAP_DECL...
    MAP_END()
...
};

Die Sache ist, für jede MAP_DECL, ich brauche das Makro in 2 Plätze zu erweitern.

class a
{    
    virtual void func()
    {        
        ...
        //does something with the decl declaration        
    }
    ...
    //also expand some stuff here    
}

Boost-Präprozessor sollte (theoretisch) Gestatten Sie mir MAP_DECL in eine Sequenz zu sammeln und erweitern sie in func () am Ende (und gleichzeitig die Klassenfelder erweitern, wie wir gehen).


Update 1 :

Ich bin mit der Boost-Preprocessor Bibliothek im Moment. Ich bin zur Zeit stecken ein neues Makro Variable / Definition wie folgt jedes Mal zu schaffen ich etwas zu der Sequenz hinzugefügt werden muss.

Ich versuche, Boost-Preprocessor Sequenzen zu erweitern und ich bin fest dies im Moment tun

#define SEQ (w)(x)(y)(z) 
#define SEQ2 BOOST_PP_SEQ_PUSH_BACK(SEQ, a)

Original :

Angenommen, ich habe den folgenden Code

#define CUR 2
#define CUR CUR + 2

Wie erzwinge ich die zweite Zeile den Wert von CUR von der ersten Zeile zu benutzen?

War es hilfreich?

Lösung

Kurz und bündig, kann man nicht.

Zu dem Zeitpunkt, CUR erweitert wird (nach dem zweiten #define), wird der Präprozessor eine Instanz von CUR mit CUR ersetzen + 2, und ‚blauer Farbe‘ der Name CUR (erweitert es nicht weiter). Danach sieht der C-Compiler CUR + 2, die höchstwahrscheinlich Ausbeuten ein Übersetzungsfehler.

Andere Tipps

Auch wenn Sie das tun könnte, dann ist es gefährlich.
Beispiel:

#define CUR 2
#define CUR CUR + 2
...
int x = CUR*4; // x = 2 + 2 * 4

Sie können das nicht tun, können Sie nur jedes Makro einmal #define, sonst wird der Compiler einen Fehler verschütten.

habe ich versucht, etwas ähnliches an einer Stelle zu tun (Anfügen Präprozessor Sequenzen zu fördern). Ich traf die Mauer schwer (wegen dem, was Jonathan sagte in seiner Antwort) und am Ende ganz andere Sache zu tun.

Später fand ich, dass Boost-MPL-Typ-Sequenzen gleiche wirksame Begrenzung haben (was total Sinn macht, aber manchmal sehen Sie nicht über eine Wand, bis Sie tatsächlich in sie stoßen:))

.

Sie müssen ziemlich ganze Sequenz definieren oder ihm andere Namen geben.

Sie sind eine Membervariable wahrscheinlich zu definieren und dann mit ihm, Dinge zu tun in der Funktion (Registrierung?). Wenn Sie Nachrichten in einem Behälter zu halten, können Sie Ihre MAP_DECL eine Nachricht hinein machen hinzuzufügen, und dann in der Funktion tun nur eine for-Schleife.

#define MAP_BEGIN std::vector<Message> m_messages; \
  void buildMap() {
#define MAP_END }
#define MAP_DECL(...) m_messages.push_back(...);

Wenn jede Nachricht vom separaten Typ, try Typ Löschung (boost :: any) oder machen sie von einem Basisklasse und Speichern erben das.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top