何时使用#define或constant char / int?

时间:2013-06-29 13:10:25

标签: c constants c-preprocessor

一般来说,最好是按(char *) UserIPaddr="192.168.0.5"(int) MAX_BUF=1024定义一些特定参数(例如#defineconstant char */ int)?

我读了一些帖子说最好不要在可能时使用#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

3 个答案:

答案 0 :(得分:7)

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

例如const int不能用于:

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

答案 1 :(得分:3)

使用#define的原因很少。很少有人能够完成static constenum不能。

正如Alok Save提到的那样,static const int不能在C中产生一个整数常量表达式(我不是仔细检查C标准;但是在C ++中却不是这样)。但enum可以做到这一点。但是,纯C中的enum不会增长以适应大于INT_MAX的值。因此,如果您需要long值作为数组绑定或案例标签,#define是您的朋友。或者考虑切换到使用C ++的C子集,它没有这样的限制。

答案 2 :(得分:2)

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

the same source file

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

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