2016-04-08 3 views
2

Итак, моя Visual studio объявляет как tag1, так и tag2 неопределенными, но они определены как четкие, я не могу определить один на основе другого?C#define, основанный на другой ошибке #define

#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 

У меня есть некоторые случаи с tag2 и это говорит о том, что определение должно быть константным, но константа 1 + 99, любая помощь будет оценена.

Спасибо! BA

+0

Просьба [прочитать это] (http://stackoverflow.com/help/mcve). –

+0

Попробуйте включить параметр «Создать предварительно обработанный файл» (/ P), чтобы узнать, что происходит. –

+0

Возможно, '__COUNTER__' поможет вам. – Dani

ответ

0

На основе ответов обеспечивают я придумал решение, которое, хотя и не идеально, лучше всего подходит моему делу.

Эта реализация может осуществляться в двух формах:

Меньше изменений в будущем (только изменить «последний»):

#define push     99 
#define last     push 

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

ИЛИ

Очистить код, но повторить «толчок» в два места

#define push     99 

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

Спасибо за помощь.

4

Прежде всего, вы не можете определить один и тот же макрос дважды. Если вам необходимо заменить макрос, вы должны сначала #undef его:

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

Но это не решит проблему. Макросы не являются переменными, вы не можете использовать их для хранения значений для повторного использования в более поздней точке. Это замена текста, поэтому они существуют параллельно.

Таким образом, новое определение #define tag1 tag2 расширилось до 1+tag1. Но на данный момент ничего не называется tag1, потому что мы просто не определили его, и мы еще не сделали его переопределения.

Вдумайтесь это слишком много, и вы превратитесь с ума :) Так просто забыть о том, что все это, что вы действительно хотите сделать это:

#define tag1_val 99 
#define tag1  tag1_val 

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

не работает, потому что мне действительно нужен tag2 ...ток: #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 Это тоже не сработает по причинам, которые я пытался объяснить. Теперь, если вам нужен tag2, просто используйте мой код и добавьте '#define tag2 (tag1_val + 1)' – Lundin

+0

. Я отредактирую вопрос, чтобы рассмотреть все переменные. Потому что я действительно хочу, чтобы tag1 был динамическим на основе последнего тега ... – Buser

1

Если все, что вы хотите, несколько символических имен для целочисленных констант, вы можете определить их в enum, как это:

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

new_instr будет 100 (если DEBUG определено), last_plus_1 будет либо 101 (если определено DEBUG) или 100 (если DEBUG не определено), а last_instr будет составлять менее last_plus_1.

Смежные вопросы