为方便起见,不能使用#define

时间:2013-03-02 16:39:47

标签: ios objective-c xcode cocoa-touch c-preprocessor

我可能犯了一些语法错误,但我无法理解为什么我的代码无效:

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

#define kCountry "Country";

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

然后在函数体中:

 floatCountries = 74,2;
 [[NSUserDefaults standardUserDefaults]setFloat:floatCountries forKey:kCountry];

  float test= [[NSUserDefaults standardUserDefaults]floatForKey:kCountry];
  NSLog(@"%f", test);

在那一个 - 预期的表达。

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

3 个答案:

答案 0 :(得分:9)

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

#define kCountry @"Country"

答案 1 :(得分:5)

使用:

#define kCountry @"Country"

你最后加了一个分号。

因为这将替换为字符串值,您需要放置@

答案 2 :(得分:5)

解释为什么这不起作用:

分号

#define kCountry "Country";
     

在这种情况下,我从xCode得到了红色警告 - 预期]

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

(除非你打开“将警告视为错误”;然后,从某种意义上说,所有警告都是红色的 - 因为它们是错误的。)

反正。

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

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

因此,当你去使用宏时:

[[NSUserDefaults standardUserDefaults]setFloat:floatCountries forKey:kCountry];

float test= [[NSUserDefaults standardUserDefaults]floatForKey:kCountry];

预处理器替换宏如下:

[[NSUserDefaults standardUserDefaults]setFloat:floatCountries forKey:"Country";];

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

分号不能进入声明;它必须来。因此,上述陈述无效。

修复方法是从你#define宏的行中删除分号,这样分号就不会出现在输出中:

[[NSUserDefaults standardUserDefaults]setFloat:floatCountries forKey:"Country"];

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

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

所以,这是其中一个问题。另一个是......

您使用的字符串

"Country"是一个C字符串。它仅适用于C字符串和stdio库(包括函数printfstrcat等)以及需要C字符串的各种其他API(例如+[NSString stringWithUTF8String:]和{{1} })。

NSUserDefaults,就像Cocoa中需要字符串的其他东西一样,需要一个Cocoa字符串对象 - 一个NSString。 NSString文字的语法是相同的,但前面有+[NSString stringWithCString:encoding:]@

因此有效的版本:

@"Country"

产生预处理输出:

#define kCountry @"Country"

在两个地方都没有语法错误和正确的字符串类型,这是可以使用的版本。

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

数字语法

您尝试为变量指定一个数字,但我认为您会找到与您预期不同的数字。

[[NSUserDefaults standardUserDefaults]setFloat:floatCountries forKey:@"Country"];

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

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

floatCountries = 74,2;

您会发现输出为NSLog(@"%f", floatCountries);

C有一个名为逗号运算符的运算符,它只是2.0,其中x和y可以是任何表达式(理想情况下是彼此兼容的类型 - 例如,两个数字)。

逗号运算符首先计算左侧表达式,然后计算右侧表达式,并自行计算右侧表达式。

x, y首先评估表达式74,2,然后评估表达式74,然后评估为2。因此,您可以将22(根据需要自动转换)分配给变量。

将它与字面数字一起使用似乎有些愚蠢,而且确实如此。逗号运算符存在与具有副作用的表达式一起使用,例如涉及int++运算符的表达式。

通常不鼓励使用逗号运算符,因为结果代码不清楚:通常,每行应该做一件事,但--之类的行会做事情

尽管如此,它仍然有效,正如您所发现的那样。但是,如果您打开了“未使用的值”警告(应该如此),您应该收到警告,因为表达式的一半实际上是未使用的 - 您将x = ++y, --z;放在地板上。无害,但这不是你想要做的症状。

你想要的是:

74