我想在 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个。
在看到前三个答案后,我想我需要解释更多; 我想知道的是如何根据以前的值重新定义常量。
答案 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 + 10
或10 + 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