【问题标题】:How to define a constant conditionally如何有条件地定义一个常数
【发布时间】:2010-06-22 02:36:57
【问题描述】:

我想在我的 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

你能告诉我最简单的实现方法吗?

而且它应该足够灵活,因为我的 constantsconditions 的数量都超过 10 个。

看到前三个答案后,我想我需要解释一下; 我想知道的是如何根据之前的值重新定义我的常量。

【问题讨论】:

  • 你使用的“汇编代码”的定义我想我从来没有听说过
  • 我是一名固件工程师,所以我需要将一些汇编代码转换为 C 语言。

标签: c macros constants c-preprocessor


【解决方案1】:

您可以使用预处理指令来做到这一点:

#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 + 1020:到第二个宏定义时可以调用,第一个定义不再存在。

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

#define INITIAL_A 10
#define A INITIAL_A + 10

您应该考虑从The Definitive C Book Guide and List 获得一本入门书籍;其中任何一个都将详细介绍使用预处理指令可以完成的工作。

【讨论】:

  • 你漏掉了Or操作符.... 而我的编译器(VC7.1)会提示错误:宏重定义
  • @Celia:你不能重新定义宏;它们必须具有唯一的名称(例如,在您的代码中,前两行将两个变量分配为零,这两个变量需要与 Const1Const2 不同的名称)。
  • 我知道我无法重新定义宏..这就是我来这里的原因...我只是想为我的常量获取一个累积值。
【解决方案2】:

一旦分配了常量,就不能重新定义它的值——如果可以的话,它就不是常量了,对吗?由于看起来您正在尝试根据预处理器标志在常量中设置各种位,因此您可以 #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】:

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

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

【讨论】:

【解决方案4】:

在 C 中,您可以使用预处理器宏来完成:

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

【讨论】:

    猜你喜欢
    • 2019-09-06
    • 2011-06-19
    • 2022-01-14
    • 2012-06-08
    • 2010-12-02
    • 2022-01-13
    • 1970-01-01
    • 2012-05-05
    • 2017-06-30
    相关资源
    最近更新 更多