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头中宏巫毒的受害者
有选择地注释掉代码行并重新编译以查明问题所在。
如果你注释掉一行,然后