【问题标题】:Why are there defined constants and declared constants in CPP?为什么CPP中有定义的常量和声明的常量?
【发布时间】:2010-04-20 21:43:02
【问题描述】:

为什么在 CPP 中有两种“声明”常量的方法?
哪个更好,或者我应该写,我应该在什么时候使用它们中的哪一个?

#define MYCON 100
const int MYCON=100

【问题讨论】:

    标签: c++ constants


    【解决方案1】:

    短规则:对于条件编译(例如 DEBUG 和 RELEASE 的不同代码片段),请使用 #define。对于所有其他情况,请使用 const 构造。

    【讨论】:

    • +1:好的经验法则 - 不知道为什么其他人对此投了反对票?
    【解决方案2】:

    使用#define 会产生一个预处理器符号:预处理器发生后它根本不存在,相当于在文件中输入了“100”。

    预处理器符号的特点:

    • 您可以在预处理器指令中使用它们,例如#ifdef
    • 它有词法范围
    • 您可以获取他们的地址(因此不能将它们用作需要type* 的参数)

    使用 const type 声明一个 c++ 变量。

    • 你可以在预处理器指令中使用这个东西
    • 它遵循通常的 c++ 范围规则
    • 你可以拿它的地址

    人们普遍认为,将const 用于“程序内”常量,#define 仅用于条件编译(这代表了从(非常!)过去的变化,那时您不能总是依赖 c 编译器智能处理const 并首选使用#define)。如果没有别的,这可以让您更好地控制符号的范围。

    【讨论】:

      【解决方案3】:

      在 C 的原始版本中,#define 是唯一可用于声明常量值的方法。这是在编译时而不是在运行时完成的:编译器对每条指令的值进行硬编码。 const 是 C++ 的一个特性(后来以有限的方式添加到 C 中),在 C++ 中建议您使用 const 而不是#define。 const变量实际上存在于内存中,可以在运行时在构造时初始化。

      #define 然而,在 C++ 中仍然经常使用,主要用于与编译器的通信。

      一些例子:

      防止多个类声明的类头包装器:

      #ifdef VAL_H
      #define VAL_H
      
      // Define class header
      
      #endif // VAL_H
      

      条件编译:

      // Comment this line to disable debug output
      #define DEBUG
      
      // Some code
      #ifdef DEBUG
      // Only gets compiled if DEBUG is defined.
      cerr << "Debug output here" << endl;
      #endif
      

      【讨论】:

        猜你喜欢
        • 2011-09-17
        • 2011-12-26
        • 2011-10-13
        • 1970-01-01
        • 1970-01-01
        • 2020-03-19
        • 2014-07-20
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多