gpt4 book ai didi

objective-c - 条件编译:initializer element is not a compile-time constant

转载 作者:行者123 更新时间:2023-12-01 18:28:17 27 4
gpt4 key购买 nike

我必须将变量分配给这样的常量(下面的代码在我的文件代码的开头,在 @implementation 之前):

#ifdef DEBUG
NSString *hostStr=[[NSString alloc]init];
hostStr=@"xxx.mycompany.com";
static NSString * const host = hostStr;
#endif

如果我喜欢这样:
#ifdef DEBUG
static NSString * const host = @"xxx.mycompany.com";
#endif

那可行。

实际上,在我的真实案例中, host将包含全局值的值(在应用程序委托(delegate)中声明并在另一个 View Controller 中初始化)。但是为了简化我的问题,我使用了这个例子(因为这两种情况都给了我同样的错误)。

请问我该如何解决这个问题。提前谢谢。

最佳答案

这里有几个问题。

设置的常数任何功能都不能是“动态的”。这意味着编译器必须在程序运行之前知道常量值是什么。如果你这样说:

static int x = myFunction(459);

在程序实际运行之前,编译器无法知道 myFunction() 将返回什么。

这就是为什么:
NSString *hostStr=[[NSString alloc]init];

导致语法错误。编译器 不会制作常量时执行任何代码。

解决方案很简单:
NSString *host=@"www.mycompany.com";

请注意,我没有使用“静态”限定词。这将使“主机”仅可用于声明它的文件中的代码。删除“静态”限定符使其成为全局。

要从另一个文件访问这个全局变量,另一个文件需要声明
extern NSString *host;

此时另一个文件将能够看到“主机”的内容。

还有一点需要指出的是:
NSString *hostStr=[[NSString alloc]init];
hostStr=@"xxx.mycompany.com";

并没有真正做太多。您使用 alloc/init 创建一个 NSString,然后立即分配
一个常量,将您创建的 NSString 移到一边,而不处理它,从而造成内存泄漏。 (如果您启用了 ARC,那么这不是问题。ARC 无所不知。)

关于objective-c - 条件编译:initializer element is not a compile-time constant,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11149009/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com