【问题标题】:Can't declare "div" in enum不能在枚举中声明“div”
【发布时间】:2014-08-04 22:44:23
【问题描述】:

我想声明一个具有以下基本数学运算的枚举:

enum Operations 
{
    div,
    mul,
    add,
    sub
};

但是编译器抱怨这个声明,因为 div 是 C++ 中的保留关键字。我怎样才能覆盖它?或者有什么解决办法?

这是错误信息:

错误:“div”被重新声明为不同类型的符号 /usr/include/stdlib.h:158: 错误:'div_t div(int, int)' 的先前声明

【问题讨论】:

  • 是的,我的评论已更改。
  • 这不是 C++ 保留关键字,它是在 中声明的函数标识符。选择其他名称,例如 div_ 或 Div。您可以#define div div_,但这样做您将无法访问 div 函数。

标签: c++ enums namespaces scope


【解决方案1】:

div 不是关键字,而是标准库函数,在 stdlib.h 中声明,可能在 cstdlib 中声明。

最简单的解决方案是使用不同的标识符。否则,您可以使用范围枚举:

enum class Operations 
{
    div,
    mul,
    add,
    sub
};

这会将枚举的值放在Operations 范围内(Operations::divOperations::mul 等)

【讨论】:

    【解决方案2】:

    因为div 是在cstdlib 中声明的函数,所以可以省略全局枚举的名称。这意味着您不能div 用作枚举。

    在 C++11 中,针对这种情况引入了作用域枚举

    enum class Operations 
    {
        div,
        mul,
        add,
        sub
    };
    

    然后你可以使用Operations::div

    【讨论】:

      【解决方案3】:

      您可以创建一个新的命名空间:

      #include <stdlib.h>
      
      namespace a
      {
          enum Operations
          {
              div,
              mul,
              add,
              sub
          };
      }
      
      int main()
      {
          a::div;
          return 0;
      }
      

      【讨论】:

      • 缩进?我建议使用空格而不是制表符。
      • 大多数代码编辑器都有制表符到空格的转换
      【解决方案4】:

      在 C++ 中使用 cstdlib,而不是 stdlib.h。并且不要将std 命名空间导入全局命名空间(即不要使用using namespace std)。那么全局命名空间中就不会有div与你的enum发生冲突。

      【讨论】:

      • 没关系。不幸的是,cstdlib 等人被允许将名称带入全局命名空间。这很糟糕,但就是这样。
      • @juanchopanza:是的,我想我记得在实践中注意到了这一点。这很糟糕,我会说它更强大,它首先完全破坏了将这些东西放在 std 命名空间中的目的。是的,如果您愿意,可以参考std::div。但是您仍然不能安全地使用程序中没有范围的任何标识符(例如作为类或命名空间的名称),而不检查它是否与某些(递归?)包含的头文件可能全局引入的任何名称发生冲突。
      • @MarcvanLeeuwen 它曾经是 C++11 之前的“不良行为”,从那以后就被允许了。但请注意,它仅适用于 C 标准库中具有 something.h 等效项的 csomething 标头。大部分名字都是老生常谈的,远比C++标准库的少。
      猜你喜欢
      • 2014-09-22
      • 1970-01-01
      • 1970-01-01
      • 2015-04-26
      • 2014-06-30
      • 1970-01-01
      • 2022-11-28
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多