【问题标题】:When to use #define or constant char/int?何时使用#define 或常量 char/int?
【发布时间】:2013-06-27 03:54:44
【问题描述】:

一般来说,通过#defineconstant char */ int定义一些具体参数(例如(char *) UserIPaddr="192.168.0.5"(int) MAX_BUF=1024)会更好吗?

我读到一些帖子说,如果可能,最好不要使用#define。但是,我从源代码中看到#define 在开源代码one example 上的常见用法:

#define IEEE80211_WLAN_HDR_LEN      24
    a_uint8_t *iv = NULL;
    a_uint16_t tmp;
    a_uint16_t offset = IEEE80211_WLAN_HDR_LEN;

#define 可以避免在那里使用,但我想知道为什么在这种情况下更喜欢使用#define。我应该如何决定何时使用#define

【问题讨论】:

    标签: c constants c-preprocessor


    【解决方案1】:

    在 C 中 const 声明不会产生常量表达式,因此如果您需要一个常量表达式,使用 const 是不可能的,传统且更常用的方法是使用 # define

    例如const int不能用于:

    • 一个案例标签或
    • 作为位域宽度或
    • 作为非 VLA 数组声明中的数组大小(前 C99 天)

    【讨论】:

      【解决方案2】:

      使用#define 的理由很少。 static constenum 所不能做到的几乎没有。

      正如 Alok Save 所提到的,static const int 无法在 C 中生成整数常量表达式(我没有仔细检查 C 标准;但在 C++ 中并非如此)。但是enum 可以做到这一点。但是,纯 C 中的 enum 不会增长以适应大于 INT_MAX 的值。因此,如果您需要将 long 值用作数组绑定或大小写标签,#define 是您的朋友。或者考虑改用 C++ 的 C 子集,它没有这样的限制。

      【讨论】:

      • 对于switch,最好使用枚举,这样编译器会在没有处理某些情况时发出警告。
      【解决方案3】:

      我的经验法则是不要使用#define,除非符号必须是编译时常量。考虑到这一点,我个人不会在您的示例中使用 #define

      举一个与the same source file不同的例子:

      #define CRYPTO_KEY_TYPE_AES          2
      ...
          switch (keytype) {
          case CRYPTO_KEY_TYPE_AES:
      

      这里,CRYPTO_KEY_TYPE_AES 必须是一个常量表达式,因此使用常量变量是不行的。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2012-03-28
        • 2021-11-05
        • 1970-01-01
        • 2015-10-26
        • 2019-11-15
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多