为了方便不能使用#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";];
分号不能进入语句中; 它必须来之后。 因此,上述说法是无效的。
解决方法是从#define
macros中删除分号,以便分号不会出现在输出中:
[[NSUserDefaults standardUserDefaults]setFloat:floatCountries forKey:"Country"]; float test= [[NSUserDefaults standardUserDefaults]floatForKey:"Country"];
顺便说一下,Xcode在其跳转栏中有一个选项来显示代码的完整预处理版本,编译器会看到它。 在调查macros观问题时,这可能非常方便。
所以,这是问题之一。 另一个是…
你使用的那种string
"Country"
是一个Cstring。 它只能用于Cstring和stdio库(包括函数printf
, strcat
等)以及需要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;