c++ - 枚举语法错误:缺少标记名称和常量
问题描述
我正在尝试编译一个在以下行中显示错误的应用程序
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++ 中,因为它们不考虑任何命名空间。
OP 公开的代码没有任何问题。所以,原因一定是在非暴露的某处。
想象在某个地方定义了一个宏
#define ROUTE_STATE "free"
或者
#define ROUTE_STATE 2
这将改变
enum ROUTE_STATE {
到
enum "free" {
或者
enum 2 {
真是一团糟。
如何处理?
您可以在仅预处理模式下运行编译器。例如
g++
,有一个选项-E
,其他 C++ 编译器也提供这样的选项(但可能有不同的名称)。这提供了预处理后的源代码,并向作者揭示了这些东西。标识符命名有一些约定(样式),有助于降低这种混淆的风险。因此,宏应仅以大写字母命名,但任何其他标识符都不能。例如我更喜欢
- 混合大小写的类型和枚举数值,首字母大写
- 变量和函数混合大小写,首先是非大写。
有各种各样的风格指南,但其中大部分都是常见的,只涉及大写的宏,其余的则不然。(这一定是有原因的。)
可能值得一提的是,一些甚至广泛使用的 API,如 win32,并不符合这个简单但有价值的规则。(有一次,这让我很头疼,直到我找到原因。)
推荐阅读
- android - RecyclerView中的WebView显示虚假数据
- excel - Excel Userform 加载时的动画点
- c# - 在一个事件中重新组合按钮事件
- c# - 编写 NUnit 测试时的类型冲突
- javascript - 如果我没有填写 Angular 反应式表单中的所有详细信息,表单会出错
- flutter - 如何在颤动中将图标放在字符串上?
- java - 在理解线程和在多个线程中更改变量时遇到问题
- c# - 我无法获取所有数据
- docker - Spark 工作容器以 Command exited with code 1 终止 [无法连接到本地 PC]
- f# - F# 读取自定义配置并将其表示为带有 ConfigurationElements 的 ConfigurationSection