【问题标题】:why not recommend to define an array of fixed length using macro symbolic constant? [duplicate]为什么不建议使用宏符号常量定义一个固定长度的数组? [复制]
【发布时间】:2020-03-13 17:24:50
【问题描述】:

我正在通过以下链接学习 c++ 数组:https://www.learncpp.com/cpp-tutorial/61-arrays-part-i/。现在我很困惑为什么不能使用宏符号常量来创建一个固定数组(即一个固定长度的数组)。我的意思是,为什么它在语法上可行,但根据作者的观点不推荐。

// using a macro symbolic constant
#define ARRAY_LENGTH 5
int array[ARRAY_LENGTH]; // Syntactically okay, but don't do this

【问题讨论】:

  • 看例子,不知道作者是不鼓励对数组长度使用宏符号常量还是完全不鼓励使用宏符号常量。
  • 确实,作者详细说明了为什么他们不鼓励使用宏符号常量here。现有的无数答案也涵盖了原因。

标签: c++


【解决方案1】:

因为宏是邪恶的。

说真的,没有什么是邪恶的。一切都有它的位置和有效的用途。在 C++ 中使用宏的情况极为罕见。要定义数组的大小,完全不值得用宏带来的所有缺点来换取与替代方案相比没有优点。

最大的缺点是宏不知道作用域。如果你写:void foo(int ARRAY_SIZE);,处理器会将正确的代码变成语法错误。

为什么它在语法上可行,但不推荐

你可以用宏做很多事情,但你也可以用汇编程序编写所有东西。为什么会这样?

【讨论】:

    【解决方案2】:

    此处不使用宏的一个原因是它们没有有限的范围,因此更容易发生名称冲突或使用错误的变量。

    考虑在不同范围内声明的这些数组:

    {
        #define ARRAY_LENGTH 5
        int array[ARRAY_LENGTH];
    }
    {
        #define ARRAY_LENGTH 5 // Compile error!
        int array[ARRAY_LENGTH];
    }
    {
        #define ARR_LENGTH 10
        int array[ARRAY_LENGTH]; // Wrong variable name, but not compile error!
    }
    

    使用常量变量,代码会更健壮:

    {
        const size_t ARRAY_LENGTH = 5;
        int array[ARRAY_LENGTH];
    }
    {
        const size_t ARRAY_LENGTH = 5; // Redefinition is ok
        int array[ARRAY_LENGTH];
    }
    {
        const size_t ARRAY_LENGTH = 10;
        int array[ARRAY_LENGTH];
    }
    {
        const size_t ARR_LENGTH = 10;
        int array[ARRAY_LENGTH]; // Compile error
    }
    

    【讨论】:

    • IMO enum 比 const 变量稍微整洁
    • 另外应该提到的是,您甚至根本不需要符号常量——您可以使用int array[10];,然后使用std::size(array) 来获取长度
    • @M.M 我认为“枚举”是用于列表,而不是用于单个常量。枚举值默认为int,而数组大小为size_t
    • 一个有一个枚举器的枚举非常好
    【解决方案3】:

    从 c++11 开始,我们有 constexpr 用于这种情况。

    我不知道作者的意见,但this question 详细说明了宏可能导致的问题。 (我认为没有必要在这里重复这些陈述)

    【讨论】:

    • 从 C++ 开始,甚至在 C 中,我们都有 int const 用于这种情况。
    【解决方案4】:

    宏没有范围和类型。它们可能与其他宏发生冲突。所以在 C++ 中最好定义一个命名常量,比如

    const size_t ARRAY_LENGTH = 5;
    int array[ARRAY_LENGTH];
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-08-05
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多