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

时间:2015-06-29 12:45:07

标签: c++ enums namespaces literals

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

  • 错误C2143:语法错误:在'常数'之前缺少'}'
  • 错误C2143:语法错误:缺少';'在'常数'之前
  • 错误C2059:语法错误:'常数'

以下代码:

@IBOutlet weak var SelectedService: UILabel!

@IBAction func Find(sender: AnyObject) {

}


@IBOutlet weak var ItemLabel: UILabel!



var services = ["Cafe","Coffee Shops","Bar","Takeaway","Sunday Roast","Shoe Mender","Craft Shops","Electrical"]

override func viewDidLoad() {
    super.viewDidLoad()
    // Do any additional setup after loading the view, typically from a nib.








}

override func didReceiveMemoryWarning() {
    super.didReceiveMemoryWarning()
    // Dispose of any resources that can be recreated.
}


func numberOfComponentsInPickerView(pickerView: UIPickerView) -> Int{

    return 1
}

func pickerView(pickerView: UIPickerView, numberOfRowsInComponent component: Int) -> Int{

return services.count   
}

func pickerView(pickerView: UIPickerView, titleForRow row: Int, forComponent component: Int) -> String!{

    return services[row]
}

小写“绝对”构建正常,如果我拼错ABSOLUTE,那么它构建没有错误。

我搜索了整个代码库,其他地方没有使用“ABSOLUTE”这个词。 我已经调查了没有这个改变的构建工件,我找不到任何对ABSOLUTE的引用。

是否有人指出错误或如何调试?

由于

4 个答案:

答案 0 :(得分:6)

其中一个Windows API标头ABSOLUTE中的

#define<windi.h> d(数字1)。这就是让编译器感到困惑的原因。

您可以#undef,如果您不需要,请删除<windows.h>,或重命名您的枚举。

答案 1 :(得分:3)

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

如果使用GCC,请在预处理阶段后使用-E标志停止。使用VC ++编译器,您应该使用/E和/或/P。有关详细信息,请参阅How do I see a C/C++ source file after preprocessing in Visual Studio?

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

每个条目的名称可以是Pascal大小写,并且通过枚举的名称装饰,它们变得非常易读Adjustment::Absolute,而不是旧的,无范围的枚举ABSOLUTE。由于读者可能会将自己与wingdi.h声明的宏(如Bathsheba所指出的)混淆,因此这并不具有可读性。除了可读性之外,它还避免污染封闭的命名空间。

答案 2 :(得分:2)

您正在使用visual c ++编译器和#include然后您应该收到此错误。在windows.h中,文件 #include&lt;包含wingdi.h&gt; ,在wingdi.h中你会找到

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

因此发生了错误。

答案 3 :(得分:-1)

  

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

如果您的编译器不愿意生成有用的消息(通常打印出以前定义过术语的地方),或者您怀疑自己是WinAPI标题中宏voodoo的受害者......

有选择地注释掉代码行并重新编译以查明问题。 如果您注释掉一行,并且您的程序在此之后编译,那么 行就是您的问题的根源。如果您的代码块很大,请执行&#34; binary search&#34; - 注释掉一整块,然后是一半,这样你就可以迅速缩小问题范围。

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

除此之外,您还可以调查预处理器输出。

  

并且无法选择性地注释掉标题以在测试发生变化时进行测试 - 因为新的编译器警告列表太繁重而无法完成

制作一个空白* .cpp文件,并将有问题的定义复制到其中,直到您破坏它为止。这将使您能够查明问题。

最好始终只将最小的必需标头集合包含在您自己的* .h文件中,最好完全避免使用特定于操作系统的标头,尽管在这种情况下实际上不可能。

在您的特定场景中,另一个不错的选择是更改枚举值的命名方式。通常ALL_UPPERCASE仅为宏保留(宏定义和宏常量)。此规则的一个值得注意的例外是Windows标头中定义的minmax宏(可以禁用它们)。因为您在enum中使用它,所以您与特定于操作系统的定义发生冲突。我会对枚举使用与常量和局部变量相同的命名约定。