【问题标题】:C/C++ change a define to a variableC/C++ 将定义更改为变量
【发布时间】:2013-10-25 19:34:53
【问题描述】:

简单的问题:

你如何改变 #define TIMER_MAX 0xFFFF ;成一个常量变量?我不确定要使用什么类型。是字节吗?

谢谢

【问题讨论】:

  • 那是两个字节,所以也许 - uint16_t timer_max = 0xFFFF;
  • 或者只是int。取决于我所说的上下文。
  • 如果之前作为int 运行良好,不妨保留为int
  • @bstamour 它从来不是int。宏没有固有类型。在预处理器遇到TIMER_MAX 的每个地方,该字符串都会被0xFFFF 替换。编译器永远不会看到TIMER_MAX,只会看到常量0xFFFF,因此它会将适当的强制规则等应用于该常量。
  • @sfstewman:它有一个类型,它是 int。整数字面量(即使是用十六进制表示的字面量)都是 int 类型,除非以 u 和或 l 等为后缀。

标签: c++ c variables


【解决方案1】:

需要 2 个字节,uint16_t 适合:

#include <cstdint>

const uint16_t TimerMax = 0xFFFF;

【讨论】:

  • 我唯一不同的做法是将其标记为constexpr,以便在需要时将其用于编译时编程。
  • @bstamour:标有const的标量变量是从常量表达式初始化的,是常量表达式。
  • @BenjaminLindley 这在 C++ 中是正确的,但我不相信它适用于 C,并且问题已标记为两者。当然,C 没有constexpr 修饰符。
  • @BenjaminLindley 谢谢。直到。
【解决方案2】:
const unsigned TimerMax = 0xFFFF;

应该没问题。除非您需要 TimerMax 具有特定大小。

【讨论】:

  • 如果你的 int 只有 16 位(这是标准允许的),那怎么办?你必须使它至少是一个无符号整数。
【解决方案3】:

这不是一个字节。一个字节有 8 位,因此支持 0-255 的无符号值。

值 0xFFFF 至少需要一个 16 位的值。我会把它变成一个枚举常量,让编译器选择合适的大小:

enum { TimerMax = 0xFFFF };

这样做的好处是它在 C 和 C++ 中都将被视为编译时常量。无论好坏,它还保留了不能占用TimerMax 的内存位置的宏属性。

可以说它比使用 const 变量可读性差,但它在 C 语言中很常见,我认为这不是问题。

【讨论】:

    【解决方案4】:

    您不能将#define 宏更改为变量,无论它是否为const。宏和变量声明属于编译过程的两个完全不同的阶段。宏由预处理器扩展,而变量在代码的语义分析期间分配。所以,只有当你真的知道你正在使用的代码时才这样做。

    【讨论】:

    • #defines 通常仅用作全局 const 值,不会被任何其他预处理器表达式引用。所以你可以将它们替换为 const 变量,在这些情况下,实际上建议这样做。
    • OP 想在编写代码时更改它(我认为)。这样他就可以删除宏并放入其他内容。
    【解决方案5】:

    它将是 2 个字节,所以很短。

    你可以这样定义:

    const unsigned short TimerMax = 0xFFFF;
    

    【讨论】:

      【解决方案6】:

      您可以只使用 char(1 字节) 或 short(2 字节),但两种大小都取决于机器实现,如果需要,可以用十六进制声明。

      unsigned short hex_num = 0xFFFF; // 0xFFFF is 2 bytes
      

      【讨论】:

        猜你喜欢
        • 2023-03-24
        • 1970-01-01
        • 1970-01-01
        • 2015-04-09
        • 1970-01-01
        • 1970-01-01
        • 2011-08-03
        • 1970-01-01
        • 2013-07-03
        相关资源
        最近更新 更多