首页 > 解决方案 > 枚举语法错误:缺少标记名称和常量

问题描述

我正在尝试编译一个在以下行中显示错误的应用程序

enum   ROUTE_STATE
{
        ROUTE_STATE_DOWN    =   0,          
        ROUTE_STATE_UP      =   1,          
        ROUTE_STATE_STANDBY =   2,          
        ROUTE_STATE_DISABLED=   4           
};

分别有四个错误信息

enum ": missing tag name
Syntax error: "constant
Syntax error: missing ";" (before "{")
"{" : missing function title (is it an older form table?)

在以下代码中

namespace   ECON
{
    namespace   FDC
    {
       enum ROUTE_TYPE
       {
          ROUTE_TYPE_RX = 0,                
          ROUTE_TYPE_TX = 1                 
       };
       enum   ROUTE_STATE
       {
          ROUTE_STATE_DOWN      =   0,          
          ROUTE_STATE_UP        =   1,          
          ROUTE_STATE_STANDBY   =   2,          
          ROUTE_STATE_FREE      =   3,          
          ROUTE_STATE_DISABLED  =   4           
       };
    }
}

根据四个错误信息无法定位问题,寻求帮助,谢谢

标签: c++

解决方案


详细说明退休忍者的猜测(我同意):

宏可能是一场瘟疫,尤其是在 C++ 中,因为它们不考虑任何命名空间。

OP 公开的代码没有任何问题。所以,原因一定是在非暴露的某处。

想象在某个地方定义了一个宏

#define ROUTE_STATE "free"

或者

#define ROUTE_STATE 2

这将改变

enum ROUTE_STATE {

enum "free" {

或者

enum 2 {

真是一团糟。

如何处理?

  1. 您可以在仅预处理模式下运行编译器。例如g++,有一个选项-E,其他 C++ 编译器也提供这样的选项(但可能有不同的名称)。这提供了预处理后的源代码,并向作者揭示了这些东西。

  2. 标识符命名有一些约定(样式),有助于降低这种混淆的风险。因此,宏应仅以大写字母命名,但任何其他标识符都不能。例如我更喜欢

    • 混合大小写的类型和枚举数值,首字母大写
    • 变量和函数混合大小写,首先是非大写。

有各种各样的风格指南,但其中大部分都是常见的,只涉及大写的宏,其余的则不然。(这一定是有原因的。)

可能值得一提的是,一些甚至广泛使用的 API,如 win32,并不符合这个简单但有价值的规则。(有一次,这让我很头疼,直到我找到原因。)


推荐阅读