2016-04-08 19 views
2

Also mein Visual Studio deklariert sowohl Tag1 als auch Tag2 als undefiniert, aber sie sind klar definiert, kann ich nicht definieren, eine basierend auf der anderen?C#define basiert in einem anderen #define Fehler

#define push    99 
#define last_instruction push 

#ifdef DEBUG 
    #define new_instr (1+last_instruction) //should be 100 
    #undef last_instruction 
    #define last_instruction new_instr //redifine to 100 if debug 
#endif 

ich einige Fälle mit tag2 haben, und es sagt, dass die Definition const sein muss, aber es ist konstant es 1 + 99, jede mögliche Hilfe würde geschätzt.

Danke! BA

+0

Bitte [lesen] (http://stackoverflow.com/help/mcve). –

+0

Sie sollten versuchen, die Option "Vorverarbeitete Datei erstellen" (/ P) zu aktivieren, um zu sehen, was vor sich geht. –

+0

Vielleicht hilft dir '__COUNTER__'. – Dani

Antwort

0

auf den Antworten Basierend liefere ich mit einem aufkam Lösung, die zwar nicht perfekt ist, passt aber am besten zu meinem Fall.

Diese Implementierung kann in zwei Formen erfolgen:

Weniger Änderungen in der Zukunft (nur ändern 'liest'):

#define push     99 
#define last     push 

#ifdef DEBUG 
    #define new_instr   (1+last) 
    #define last_instruction new_instr  
#else 
    #define last_instruction last 
#endif 

OR

freier Code aber wiederholen 'Push' in zwei Plätze

#define push     99 

#ifdef DEBUG 
    #define new_instr   (1+push) 
    #define last_instruction new_instr  
#else 
    #define last_instruction push 
#endif 

Danke für die Hilfe.

4

Zunächst können Sie das gleiche Makro nicht zweimal definieren. Wenn Sie einen Makro ersetzen müssen, müssen Sie es zuerst #undef:

#define tag1 99 
#ifdef DEBUG 
    #define tag2 (1+tag1) 
    #undef tag1 
    #define tag1 tag2 
#endif 

Aber das wird das Problem nicht lösen. Makros sind keine Variablen. Sie können sie nicht zum Speichern von Werten verwenden, um sie zu einem späteren Zeitpunkt wiederzuverwenden. Sie sind Textersetzung, also existieren sie irgendwie parallel.

So erweitert sich die neue Definition #define tag1 tag2 zu 1+tag1. Aber an dieser Stelle gibt es nichts, das tag1 genannt wird, weil wir es gerade undefiniert haben und wir sind noch nicht fertig, es neu zu definieren.

Ponder dies zu viel, und Sie werden drehen verrückt :) So einfach vergessen, über diese ganze Sache, was Sie wirklich wollen, ist dies:

#define tag1_val 99 
#define tag1  tag1_val 

#ifdef DEBUG 
    #undef tag1 
    #define tag1 (tag1_val+1) 
#endif 
+0

funktioniert nicht, weil ich tag2 wirklich brauchen ...Strom: #define TAG3 99 #define tag1 TAG3 #ifdef DEBUG #define tag_help \t \t (1 + TAG1) #define tag2 \t \t \t tag_help #undef tag1 #define tag1 \t \t tag_help #endif – Buser

+0

@BrunoMiguel Das wird auch nicht funktionieren, aus den Gründen, die ich versucht habe zu erklären. Wenn Sie Tag2 brauchen, benutzen Sie einfach meinen Code und fügen '' define tag2 (tag1_val + 1) ' – Lundin

+0

hinzu. Ich werde die Frage bearbeiten, um alle Variablen zu betrachten. Denn was ich wirklich will ist, dass tag1 basierend auf dem letzten Tag dynamisch ist ... – Buser

1

Wenn alles, was Sie wollen ein paar symbolischen Namen für Integer-Konstanten ist, könnte man sich in einem enum wie folgt definieren:

enum { 
    push = 99, 
#ifdef DEBUG 
    new_instr, 
#endif 
    last_plus_1, 
    last_instr = last_plus_1 - 1 
}; 

new_instr 100 sein wird (wenn DEBUG definiert), wird last_plus_1 entweder 101 sein (wenn DEBUG definiert) oder 100 (wenn DEBUG undefined), und last_instr wird eins weniger als last_plus_1 sein.

Verwandte Themen