xcode - 用C语言定义一个 `extern` var,xcode发送一个 `Undefined symbols for architecture x86_64`

标签 xcode extern

这个问题很难描述,我会尽力的。 好的,这是详细信息:

  1. 我有一个公共(public)头文件,名为header.h
  2. 在header.h中定义一个extern int a;;
  3. 创建test1.c并包含header.h
  4. test1.c中使用var a,但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/

相关文章:

ios - 是否可以将 subview 发送到 Storyboard中创建的元素的后面?

c++ - 如何从 C 调用 C++ 方法?

ios - 默认 Xcode 游戏模板的 View 大小错误

ios - 将值传回 DetailViewController

ios - 向导航栏添加另一个按钮

ios - Peek-and-Pop UIView 显示 SFSafariViewController

c++ - Visual Studio 2010 上 C++ 中外部数组允许的最大数组大小

c++ - 变量模板的显式特化

c - 在 c extern 中引用外部 msp430 程序集 .string

c++ - 外部变量的问题