C++ 如何找到C++;编译器认为定义为常量?

C++ 如何找到C++;编译器认为定义为常量?,c++,enums,namespaces,literals,C++,Enums,Namespaces,Literals,我在尝试构建应用程序时报告了以下错误: 错误C2143:语法错误:“常量”之前缺少“}” 错误C2143:语法错误:缺少“;”在“常数”之前 错误C2059:语法错误:“常量” 对于以下代码: namespace oP { enum adjustment { AUTO_OFF, AUTO_ONCE, AUTO_CONTINUOUS, AUTO_SEMI, ABSOLUTE,

我在尝试构建应用程序时报告了以下错误:

  • 错误C2143:语法错误:“常量”之前缺少“}”
  • 错误C2143:语法错误:缺少“;”在“常数”之前
  • 错误C2059:语法错误:“常量”
对于以下代码:

namespace oP
{
      enum adjustment
      {
         AUTO_OFF,
         AUTO_ONCE,
         AUTO_CONTINUOUS,
         AUTO_SEMI,
         ABSOLUTE,        // The line that the errors point to.
         NUDGE
      };
}
小写的“absolute”可以构建,如果我拼错了absolute,那么它构建时不会出错

我已经搜索了我的整个代码库,没有其他地方使用“绝对”这个词。 我已经调查了构建的工件,但没有进行此更改,我在其中找不到任何对绝对值的引用

有没有人能指出问题所在或如何调试


谢谢

绝对
#在一个windows API头
中定义
d(到数字1)。这就是让编译器感到困惑的地方


您可以
#取消定义
,如果不需要,可以删除
,或者重命名枚举。

绝对
#在一个windows API头
中定义
d(到数字1)。这就是让编译器感到困惑的地方


您可以
#取消定义
它,如果不需要它,可以删除
,或者重命名枚举。

您在其中一个包含的文件中的某个位置定义了一个宏;检查一下。更简单的方法是检查预处理器的输出

如果使用GCC,请在预处理阶段后使用
-E
标志停止。对于VC++编译器,您应该使用
/E
和/或
/P
。有关详细信息,请参阅



通常惯例是用大写字母命名宏;如果使用C++03(普通)枚举,这也适用于枚举。更好的选择是使用C++11的强类型


每个条目的名称可以是Pascal大小写,并且通过枚举的名称修饰,它们变得非常可读
Adjustment::Absolute
,而不是较早的非范围枚举的
Absolute
。这不是很容易理解,因为读者可能会将自己与
wingdi.h
声明的宏混淆(正如芭丝谢芭指出的)。除了可读性之外,它还可以避免污染封闭的名称空间。

您在其中一个包含的文件中的某个位置定义了一个宏;检查一下。更简单的方法是检查预处理器的输出

如果使用GCC,请在预处理阶段后使用
-E
标志停止。对于VC++编译器,您应该使用
/E
和/或
/P
。有关详细信息,请参阅



通常惯例是用大写字母命名宏;如果使用C++03(普通)枚举,这也适用于枚举。更好的选择是使用C++11的强类型


每个条目的名称可以是Pascal大小写,并且通过枚举的名称修饰,它们变得非常可读
Adjustment::Absolute
,而不是较早的非范围枚举的
Absolute
。这不是很容易理解,因为读者可能会将自己与
wingdi.h
声明的宏混淆(正如芭丝谢芭指出的)。除了可读性之外,它还避免了对封闭命名空间的污染。

< p>您正在使用VisualC++编译器和γ包含,那么您应该得到这个错误。在windows.h中包含文件#include,您将在wingdi.h中找到该文件

/* Coordinate Modes */
#define ABSOLUTE            1
#define RELATIVE            2

<> >发生错误。

< p>你使用VisualC++编译器和γ包含,那么你应该得到这个错误。在windows.h中包含文件#include,您将在wingdi.h中找到该文件

/* Coordinate Modes */
#define ABSOLUTE            1
#define RELATIVE            2
因此发生了错误

<>我如何找到C++编译器认为的定义为常数?< /p>的东西? 如果您的编译器不愿意生成有用的消息(通常它打印之前定义的术语),或者您怀疑自己是WinAPI头中宏巫毒的受害者

有选择地注释掉代码行并重新编译以查明问题所在。 如果您注释掉一行,然后您的程序进行编译,这一行就是问题的根源。如果您的代码块很大,请执行“二进制搜索”——注释掉整个代码块,然后注释掉其中的一半,这样您就可以快速缩小问题范围

在IDE中,您通常可以将鼠标悬停在项目上以查看其定义的位置,或按键或使用上下文菜单“跳转到定义”

除此之外,您还可以研究预处理器的输出


并且不能有选择地注释出要在更改时测试的标题,因为新的编译器警告列表将过于繁重,无法处理

制作一个空白的*.cpp文件,并将有问题的定义复制到其中,直到将其破坏为止。这会让你找出问题所在

始终只在自己的*.h文件中包含最少的必要头是一种好的做法,最好完全避免使用特定于操作系统的头,尽管在这种情况下这实际上是不可能的

在特定场景中,另一个好的选择是更改枚举值的命名样式。通常情况下,
所有大写字母
仅保留给宏(宏定义和宏常量)。此规则的一个显著例外是在Windows标题中定义的
min
max
宏(它们可以被禁用)。因为您在
枚举中使用了它,所以与特定于操作系统的定义冲突。对于枚举,我将使用与常量和局部变量相同的命名约定

<>我如何找到C++编译器认为的定义为常数?< /p>的东西? 如果您的编译器不愿意生成有用的消息(通常它打印之前定义的术语),或者您怀疑自己是WinAPI头中宏巫毒的受害者

有选择地注释掉代码行并重新编译以查明问题所在。 如果你注释掉一行,然后