Как определить постоянную условно - PullRequest
1 голос
/ 22 июня 2010

Я хочу определить некоторые константы в моем файле C .

Код сборки такой:

Const1 = 0

Const2 = 0

IF Condition1_SUPPORT

    Const1 = Const1 or (1 shl 6)

    Const2 = Const2 or (1 shl 3)

ENDIF

IF Condition2_SUPPORT

    Const1 = Const1 or (1 shl 5)

    Const2 = Const2 or (1 shl 2)

ENDIF

Не могли бы вы сказать мне самый простой способ реализовать это?

И это должно быть достаточно гибким, потому что число моих констант и условий больше 10.

Увидев первые три ответа, я думаю, мне нужно объяснить больше; Я хочу знать, как переопределить мою константу на основе ее предыдущего значения.

Ответы [ 4 ]

2 голосов
/ 22 июня 2010

Вы можете сделать это, используя директивы предварительной обработки:

#if Condition1_SUPPORT
    #define Const1 (1 << 6)
    // ...
#elif Condition2_SUPPORT
    #define Const1 (1 << 5)
    // ...
#endif

Чтобы отредактировать вопрос: вы не можете переопределить макрос на основе его предыдущего значения. Макрос может иметь только одно значение за раз, и его список замены оценивается только тогда, когда он вызывается, а не когда он определен. Например, это невозможно:

#define A 10
#define A A + 10

Во-первых, это недопустимое переопределение макроса: когда обрабатывается вторая строка, A уже определен как макрос, и поэтому его нельзя переопределить с помощью другой замены (вам нужно #undef макрос имя).

Во-вторых, если бы эта лицензия была (и многие компиляторы ее принимают), вторая строка при вызове будет иметь значение A + 10, а не 10 + 10 или 20, как вы хотите: ко времени определения второго макроса может быть вызвано, первое определение больше не существует.

Однако вы можете использовать разные имена, например:

#define INITIAL_A 10
#define A INITIAL_A + 10

Вам следует подумать о том, чтобы получить одну из вводных книг от Руководство и список книг Definitive C ; любой из них будет подробно описывать то, что может быть достигнуто с помощью директив предварительной обработки.

1 голос
/ 22 июня 2010

Вы не можете переопределить значение константы после того, как назначите его - если бы вы могли, это не было бы константой, не так ли? Поскольку похоже, что вы пытаетесь установить различные биты в константе на основе флагов препроцессора, вы можете #define разделить константы для каждого вклада в условие, а затем построить окончательное значение в конце:

#if Condition1_SUPPORT
#  define Const1_Cond1_Bit (1 << 6)
#  define Const2_Cond1_Bit (1 << 3)
#else
#  define Const1_Cond1_Bit (0)
#  define Const2_Cond1_Bit (0)
#endif

#if Condition2_SUPPORT
#  define Const1_Cond2_Bit (1 << 5)
#  define Const2_Cond2_Bit (1 << 2)
#else
#  define Const1_Cond2_Bit (0)
#  define Const2_Cond2_Bit (0)
#endif

#define Const1 (Const1_Cond1_Bit | Const1_Cond2_Bit)
#define Const2 (Const2_Cond1_Bit | Const2_Cond2_Bit)

Затем вы можете #undef все промежуточные константы, если проблема заключается в загрязнении пространства имен.

1 голос
/ 22 июня 2010

Вы можете использовать макросы препроцессора для условного определения постоянной переменной, например

#if SOME_CONDITION
    const int my_constant = 10;
#else
    const int my_constant = 5;
#endif
0 голосов
/ 22 июня 2010

В C вы должны использовать макросы препроцессора для достижения следующих целей:

#ifdef COND1_SUPPORT
#define CONST1 CONST1_VAL1
#define CONST2 CONST2_VAL1
#elif COND2_SUPPORT
#define CONST1 CONST1_VAL2
#define CONST2 CONST2_VAL2
#endif
...