2016-02-17 3 views
2

Я хочу присвоить значение макросу, основанному на значении другого макроса. Однако два макроса подключены. Есть ли способ избежать этого? Следующий минимальный пример показывает, что мне нужно:Могу ли я каким-то образом иметь статические макросы C?

#define VALUEA "A" 
#define VALUEB "B" 

// somewhere I define CHOOSE 
#define CHOOSE VALUEA 

// MY_MACRO shall have the value of CHOOSE, but AT THE MOMENT of this line. 
// I want to reassign CHOOSE while MY_MACRO stays the same. 

#define MY_MACRO CHOOSE 
// now MY_MACRO has evaluates to CHOOSE evaluates to "A" 

#define CHOOSE VALUEB 
// now MY_MACRO has evaluates to "B" but I want it to be "A" 
+0

Может #define и директивы директивы #undef помочь в вашем сценарии? – GingerJack

+0

То, что вы просите, невозможно, если вы не определяете 'MY_MACRO' как' VALUEA' напрямую. – user694733

+0

Может быть? Что произойдет, если я определяю и переопределяю ВЫБОР? – Fabian

ответ

1

компилятор будет делать предварительную обработку всего проекта до компиляции, так что если вы делаете что-то подобное, что это приведет к новому определить макрос предупреждения и CHOOSE всегда то, что это определить последний.

Вы должны отделить код в режиме двух аналогичным образом:

#define VALUEA "A" 
#define VALUEB "B" 

#ifndef CASE_B 
    #define CHOOSE VALUEA 
#endif 

#ifdef CASE_B 
    #define CHOOSE VALUEB 
#endif 

#ifdef CASE_A 
    #define MY_MACRO CHOOSE 
#endif 

так что вам просто нужно определить CASE_A или CASE_B в соответствии с вашими задачами.

1

Тривиальным подход: «сохранить» в «значение» макроса во временной макрокоманды:

#define VALUEA "A" 
#define VALUEB "B" 

#define CHOOSE VALUEA 

#define MY_MACRO CHOOSE 

// CHOOSE -> VALUEA 
// MY_MACRO -> VALUEA 

#define TEMP MY_MACRO // save 
#undef MY_MACRO 

#define CHOOSE VALUEB 
#define MY_MACRO TEMP // restore 

// CHOOSE -> VALUEB 
// MY_MACRO -> VALUEA 
+0

Вы проверили это? Это не работает. Ни 'TEMP', ни' MY_MACRO' не имеет определенного значения после '#undef MY_MACRO'. – Fabian

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