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

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)

在那一个 - 预期的表达.

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

Ric*_*own 9

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

#define kCountry @"Country"
Run Code Online (Sandbox Code Playgroud)


Ano*_*dya 5

使用:

#define kCountry @"Country"
Run Code Online (Sandbox Code Playgroud)

你在最后添加了一个分号.

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

  • 非常感谢Anoop (2认同)

Pet*_*sey 5

解释为什么这不起作用:

分号

#define kCountry "Country";
Run Code Online (Sandbox Code Playgroud)

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

没有"红色警告"这样的事情.警告是黄色的; 错误是红色的.

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

无论如何.

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

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

因此,当你去使用宏时:

[[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";];
Run Code Online (Sandbox Code Playgroud)

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

解决方法是从#define宏所在的行中删除分号,以便分号不会出现在输出中:

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

float test= [[NSUserDefaults standardUserDefaults]floatForKey:"Country"];
Run Code Online (Sandbox Code Playgroud)

顺便说一下,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已经指出的那样:

数字语法

您试图为变量分配一个数字,但我认为您会找到一个与您预期不同的数字.

floatCountries = 74,2;
Run Code Online (Sandbox Code Playgroud)

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

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)