gpt4 book ai didi

ios - 使用全局变量时出现错误

转载 作者:行者123 更新时间:2023-11-29 04:00:52 26 4
gpt4 key购买 nike

我的程序中有 2 节课第一类是 class1,第二类是 class2。我想在类 1 中创建和初始化全局变量并在类 2 中使用,但编译器给我这个错误 XD :

Undefined symbols for architecture i386:
"_saeid", referenced from:
-[class2 viewDidLoad] in class2.o
ld: symbol(s) not found for architecture i386
clang: error: linker command failed with exit code 1 (use -v to see invocation)

我在 class1 中创建全局变量并用这种方式在 class2 中运行它,但不起作用:

class1.h

extern int saeid;   // this is global variable

@interface class1 : UITableViewController<UITableViewDataSource,UITableViewDelegate>

@property (nonatomic,strong) IBOutlet UITableView *table;

@end

class1.m

#import "class1.h"
#import "class2.h"

@implementation class1
{
int saeid;
}
@synthesize table;

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
int x = (indexPath.row)+1;
saeid = x; //initialize global variable
NSLog(@"X & SAEID: %d & %d",x,saeid);
}

class2.h

#import "class1.h"

@interface class2 : UIViewController<UIScrollViewDelegate>
{
}

@end

class2.m

#import "class2.h"

@implementation class2
{
}

- (void)viewDidLoad
{
[super viewDidLoad];

NSLog(@"Saeid in class2 : %d",saeid);

}

最佳答案

这里似乎有些困惑。最重要的是,全局变量不能位于类“内部”——根据定义,全局变量位于任何类之外。因此,如果您确实想要一个全局变量(稍后会详细介绍),那么您需要在类定义之外获取 class1.m 中的 int saeid; 定义,并将其放在文件级别。

完成此操作后,仍然无法编译。语句 extern int saeid; 粗略地告诉编译器“我在其他地方定义了一个名为 saeid 的整数,所以就假装它存在并让链接器弄清楚如何连接它。”没有理由在 class1.h 中包含此语句,因为该全局变量未在该文件中的任何位置使用。相反,您应该将此 extern 语句放在 class2.m 顶部附近。它在该文件中使用,因此您需要向编译器保证该变量在编译该文件时已在某处定义。

这些步骤应该可以编译您的代码。但现在你应该停下来思考一下你是否真的想要一个全局变量。全局变量将您的类联系在一起,并且很难在不影响(并且可能破坏)其他类的情况下更改一个类。它们使测试代码变得更加困难,并且使阅读代码变得更加困惑。这里要考虑的另一个选择是创建 saeid 作为 class1 类的属性,并向 class2 添加一个 class1* 属性。然后,当您创建 class2 实例时,将指针传递给现有的 class1 实例。 class2 实例可以保留该指针并根据需要使用它来访问 saeid 属性。

关于ios - 使用全局变量时出现错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15860211/

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