如何有条件地定义一个常量

时间:2010-06-22 02:36:57

标签: c macros constants c-preprocessor

我想在 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 个答案:

答案 0 :(得分:2)

您可以使用预处理指令执行此操作:

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

要解决问题的编辑问题:您无法根据以前的值重新定义宏。宏一次只能有一个值,其替换列表仅在调用时进行评估,而不是在定义时进行评估。例如,这是不可能的:

#define A 10
#define A A + 10

首先,它是对宏的非法重新定义:当处理第二行时,A已经被定义为宏,因此无法使用不同的替换重新定义(您必须{{1}首先是宏名称)。

其次,这是合法的(许多编译器都接受它),第二行,当被调用时,将根据需要评估为#undef,而不是A + 1010 + 10:可以调用第二个宏定义的时间,第一个定义不再存在。

但是,您可以使用不同的名称,如下所示:

20

你应该考虑从The Definitive C Book Guide and List获得一本入门书籍;其中任何一个都将涵盖使用预处理指令可以完成的一些细节。

答案 1 :(得分:1)

您可以使用预处理器宏有条件地定义常量变量,例如

#if SOME_CONDITION
    const int my_constant = 10;
#else
    const int my_constant = 5;
#endif

答案 2 :(得分:1)

一旦你指定了常量,你就无法重新定义它的值 - 如果可以的话,它不会是常数,是吗?因为看起来你试图根据预处理器标志在常量中设置各种位,所以你可以#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所有中间常量。

答案 3 :(得分:0)

在C中,您将使用预处理器宏来实现:

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