Evg*_*ban 1 xcode cocoa-touch objective-c ios c-preprocessor
我可能犯了一些语法错误,但我无法理解为什么我的代码不起作用:
在.m文件的顶部,我写道:
#define kCountry "Country";
Run Code Online (Sandbox Code Playgroud)
在这种情况下,我从xCode得到红色警告 - 预期]
然后在函数体中:
floatCountries = 74,2;
[[NSUserDefaults standardUserDefaults]setFloat:floatCountries forKey:kCountry];
float test= [[NSUserDefaults standardUserDefaults]floatForKey:kCountry];
NSLog(@"%f", test);
Run Code Online (Sandbox Code Playgroud)
在那一个 - 预期的表达.
这可能听起来有点愚蠢,但我想简化我的代码并使用它,请帮助我!:)
使用:
#define kCountry @"Country"
Run Code Online (Sandbox Code Playgroud)
你在最后添加了一个分号.
因为这将替换为字符串值,您需要放置 @
解释为什么这不起作用:
Run Code Online (Sandbox Code Playgroud)#define kCountry "Country";
在这种情况下,我从xCode得到红色警告 - 预期]
没有"红色警告"这样的事情.警告是黄色的; 错误是红色的.
(除非你打开"将警告视为错误";然后,从某种意义上说,所有警告都是红色的 - 因为它们是错误的.)
无论如何.
预处理程序指令,例如#define
不需要分号.如果包含一个,它将成为指令的一部分.
预处理器将任何宏替换为您定义的任何宏.在这种情况下,您定义了一个名为" kCountry
" 的宏,其值为" "Country;
".请注意,分号是值的一部分 - 该指令在行的末尾结束,而不是以分号结尾.
因此,当你去使用宏时:
Run Code Online (Sandbox Code Playgroud)[[NSUserDefaults standardUserDefaults]setFloat:floatCountries forKey:kCountry]; float test= [[NSUserDefaults standardUserDefaults]floatForKey:kCountry];
预处理器替换宏如下:
Run Code Online (Sandbox Code Playgroud)[[NSUserDefaults standardUserDefaults]setFloat:floatCountries forKey:"Country";]; float test= [[NSUserDefaults standardUserDefaults]floatForKey:"Country";];
分号不能进入声明; 它必须来.因此,上述陈述无效.
解决方法是从#define
宏所在的行中删除分号,以便分号不会出现在输出中:
Run Code Online (Sandbox Code Playgroud)[[NSUserDefaults standardUserDefaults]setFloat:floatCountries forKey:"Country"]; float test= [[NSUserDefaults standardUserDefaults]floatForKey:"Country"];
顺便说一下,Xcode在其跳转栏中有一个选项,可以显示完整的预处理代码版本,因为编译器会看到它.在调查宏观问题时,这可能很方便.
所以,这是问题之一.另一个是......
"Country"
是一个C字符串.这只是使用C柱和标准输入输出库(包括功能可用printf
,strcat
等等)和需要C字符串(如各种其他的API +[NSString stringWithUTF8String:]
和+[NSString stringWithCString:encoding:]
).
与需要字符串的Cocoa中的其他所有内容一样,NSUserDefaults需要一个Cocoa字符串对象 - 一个NSString.NSString文字的语法是相同的,但@
前面有一个:@"Country"
.
因此适用的版本:
#define kCountry @"Country"
Run Code Online (Sandbox Code Playgroud)
哪个产生预处理输出:
[[NSUserDefaults standardUserDefaults]setFloat:floatCountries forKey:@"Country"];
float test= [[NSUserDefaults standardUserDefaults]floatForKey:@"Country"];
Run Code Online (Sandbox Code Playgroud)
在两个地方都没有语法错误和正确的字符串类型,这是可行的版本.
哦,正如Anoop Vaidya已经指出的那样:
您试图为变量分配一个数字,但我认为您会找到一个与您预期不同的数字.
Run Code Online (Sandbox Code Playgroud)floatCountries = 74,2;
如果使用如下语句打印此变量的值:
NSLog(@"%f", floatCountries);
Run Code Online (Sandbox Code Playgroud)
你会发现输出是2.0
.
C有一个叫做逗号运算符的运算符,它很简单x, y
,其中x和y可以是任何表达式(理想情况下是彼此兼容的类型 - 例如,两个数字).
逗号运算符首先计算左侧表达式,然后计算右侧表达式,并自行计算右侧表达式.
74,2
首先计算表达式74
,然后计算表达式2
,然后计算结果2
.因此,您可以将2
(a int
,根据需要自动转换)分配给变量.
将它与字面数字一起使用似乎有些愚蠢,而且确实如此.逗号运算符存在与具有副作用的表达式一起使用,例如涉及++
和--
运算符的表达式.
通常不鼓励使用逗号运算符,因为结果代码不清楚:通常,每行应该做一件事,但是x = ++y, --z;
做三行之类的行.
尽管如此,正如您所发现的那样,它是有效的.但是,如果您打开了"未使用的值"警告(应该如此),您应该收到警告,因为表达的一半实际上是未使用的 - 您将其丢弃74
在地板上.无害,但这是一个症状,这不是你的意思.
你想要的是:
floatCountries = 74.2;
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
245 次 |
最近记录: |