尝试构建应用程序时,我报告了以下错误:
以下代码:
@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的引用。
是否有人指出错误或如何调试?
由于
答案 0 :(得分:6)
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标头中定义的min
和max
宏(可以禁用它们)。因为您在enum
中使用它,所以您与特定于操作系统的定义发生冲突。我会对枚举使用与常量和局部变量相同的命名约定。