为了方便不能使用#define

我可能犯了一些语法错误,但我不明白为什么我的代码不工作:

在.m文件的顶部,我写道:

#define kCountry "Country"; 

在这种情况下,我得到了来自xCode的红色警告 – 预期]

然后在函数体中:

  floatCountries = 74,2; [[NSUserDefaults standardUserDefaults]setFloat:floatCountries forKey:kCountry]; float test= [[NSUserDefaults standardUserDefaults]floatForKey:kCountry]; NSLog(@"%f", test); 

在那一个 – 预期的expression。

这听起来有点愚蠢,但我想简化我的代码,并使用它,请帮助我! 🙂

使用:

 #define kCountry @"Country" 

最后加了一个分号。

因为这将被replace为string值,你需要把@

从定义的末尾删除分号并添加“@”:

 #define kCountry @"Country" 

为了解释为什么这不起作用:

分号

 #define kCountry "Country"; 

在这种情况下,我得到了来自xCode的红色警告 – 预计]

没有“红色警告”这样的事情。 警告是黄色的; 错误是红色的。

(除非你打开“把警告当作错误”,那么从某种意义上说,所有的警告都是红色的 – 因为那么它们就是错误的。)

无论如何。

预处理器指令(如#define不需要分号。 如果包含一个,它将成为指令的一部分。

预处理器用您定义的任何macros来replace任何macros。 在这种情况下,您定义了一个名为“ kCountry ”的macros,其值为“ "Country; ”。请注意, 分号是值一部分,该指令在行尾结束,而不是分号。

因此,当你使用macros时:

 [[NSUserDefaults standardUserDefaults]setFloat:floatCountries forKey:kCountry]; float test= [[NSUserDefaults standardUserDefaults]floatForKey:kCountry]; 

预处理器如下所示replacemacros:

 [[NSUserDefaults standardUserDefaults]setFloat:floatCountries forKey:"Country";]; float test= [[NSUserDefaults standardUserDefaults]floatForKey:"Country";]; 

分号不能进入语句中; 它必须来之后。 因此,上述说法是无效的。

解决方法是从#definemacros中删除分号,以便分号不会出现在输出中:

 [[NSUserDefaults standardUserDefaults]setFloat:floatCountries forKey:"Country"]; float test= [[NSUserDefaults standardUserDefaults]floatForKey:"Country"]; 

顺便说一下,Xcode在其跳转栏中有一个选项来显示代码的完整预处理版本,编译器会看到它。 在调查macros观问题时,这可能非常方便。

所以,这是问题之一。 另一个是…

你使用的那种string

"Country"是一个Cstring。 它只能用于Cstring和stdio库(包括函数printfstrcat等)以及需要Cstring的各种其他API(如+[NSString stringWithUTF8String:]+[NSString stringWithCString:encoding:] )。

NSUserDefaults和Cocoa中需要一个string的其他东西一样,需要一个Cocoastring对象 – 一个NSString。 NSString文字的语法是相同的,但是前面有一个@@"Country"

因此,该版本的作品:

 #define kCountry @"Country" 

哪一个产生预处理输出:

 [[NSUserDefaults standardUserDefaults]setFloat:floatCountries forKey:@"Country"]; float test= [[NSUserDefaults standardUserDefaults]floatForKey:@"Country"]; 

在两个地方都没有语法错误和正确的string,这是可以工作的版本。

噢,正如Anoop Vaidya已经指出的那样:

数字语法

你试图给一个variables赋一个数字,但是我想你会发现一个数字比你想象的要多。

 floatCountries = 74,2; 

如果使用如下语句打印此variables的值:

 NSLog(@"%f", floatCountries); 

你会发现输出是2.0

C有一个名为逗号运算符的运算符,它简单地是x, y ,其中x和y可以是任何expression式(理想情况下是相互兼容的types – 例如两个数字)。

逗号运算符首先评估左侧expression式,然后评估右侧expression式,然后评估右侧expression式。

74,2首先评估expression式74 ,然后评估expression式2 ,然后评估为2 。 因此,您将2 (一个int ,根据需要自动转换)分配给variables。

在文字数字中使用这个看起来有些愚蠢,而且是这样的。 逗号运算符的存在与具有副作用的expression式(例如涉及++--运算符的expression式)一起使用。

通常不鼓励使用逗号运算符,因为结果代码是不清楚的:通常每行应该做一件事,但是一行如x = ++y, --z;件事。

但是,如你所见,这是有效的。 但是,如果您打开了“未使用的值”警告(因为您应该),您应该会收到警告,因为其中一半的expression式实际上是未使用的,所以将74放在了地板上。 无害,但这不是你想要做的一个症状。

你想要的是:

 floatCountries = 74.2;