6

一般来说,用或来定义一些特定的参数(例如(char *) UserIPaddr="192.168.0.5"(int) MAX_BUF=1024)会更好吗?#defineconstant char */ int

我读了一些帖子说最好不要#define在可能的情况下使用。但是,我在源代码中看到了一个非常常见的#define开源代码示例

#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或不使用?

4

3 回答 3

7

在 C 中 const 声明不会产生常量表达式,所以如果你需要一个常量表达式是不可能的 using const,传统的和更常用的方法是 using # define

例如const int不能用于:

  • 案例标签或
  • 作为位域宽度或
  • 作为非 VLA 数组声明中的数组大小(C99 天之前)
于 2013-06-29T13:12:46.720 回答
3

使用#define. 它几乎没有做到static constenum不能做到。

正如 Alok Save 所提到的,static const int不能在 C 中生成一个整数常量表达式(我没有仔细检查 C 标准;但在 C++ 中并非如此)。但enum能做到。然而enum,在纯 C 中,不会增长以容纳大于 的值INT_MAX。因此,如果您需要一个long值来用作数组绑定或大小写标签,那#define就是您的朋友。或者考虑切换到使用没有此类限制的 C++ 的 C 子集。

于 2013-06-29T13:17:45.503 回答
2

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

同一个源文件中举一个不同的例子:

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

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

于 2013-06-29T13:14:27.873 回答