这个问题很难描述,我会尽力的。 好的,这是详细信息:
- 我有一个公共(public)头文件,名为
header.h
; - 在header.h中定义一个
extern int a;
; - 创建
test1.c
并包含header.h
; - 在
test1.c
中使用vara
,但xcode报错:Undefined symbols for architecture x86_64
;
我试过删除extern
,这个题就没有了。我在谷歌搜索extern
,他们说如果你不添加extern
,xcode会自动添加extern
。实际上,两者之间是有区别的自己添加extern
,xcode添加extern
。
那有什么区别?
最佳答案
当您声明一个变量 extern
时,这就是对编译器的 promise ,“相信我,它会在您需要时出现。”它不生成变量,它只是告诉编译器它在某个地方被声明为真实的,而编译器不需要知道在哪里。
你对编译器撒了谎。你实际上并没有在任何地方声明变量,你只是说你会。然后当链接器找它的时候,它找不到它。
当您去掉 extern
时,这会将变量的 promise 变成了实际的声明。编译器不必相信你,它只是按照你告诉它的那样创建变量。但是因为它在 header 中,如果您将该变量包含在两个不同的代码文件中并将它们编译成单独的目标文件,那么当您尝试链接它们时,您会收到有关重复符号的错误。 extern
的正确使用方法是在头文件中声明变量extern
,然后在实现中声明为real(.c
)文件。
标题.h:
#ifndef HEADER_H
#define HEADER_H
extern int a;
#endif
测试1.c
#include "header.h"
int a = 5;
...
然后您可以从不同的 c 文件访问相同的变量 a
。
测试2.c
#include "header.h"
int foo() {
return a;
}
关于xcode - 用C语言定义一个 `extern` var,xcode发送一个 `Undefined symbols for architecture x86_64`,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28892013/