【问题标题】:c extern undefined reference [duplicate]c extern undefined reference [重复]
【发布时间】:2020-09-02 13:24:58
【问题描述】:

我很抱歉我确定这是一个简单的错误。但几个小时后,我无法弄清楚我做错了什么。我知道extern 需要在函数外声明并在函数内定义。但我无法让它工作。

这是我最小的代码错误。

extern double d;
int main(void) {
    d = 0;
    return 0;
}
/home/0KzRYK/ccCTD3Lf.o: In function `main':
prog.c:(.text.startup+0x3): undefined reference to `d'
collect2: error: ld returned 1 exit status

【问题讨论】:

  • 你只有声明,没有定义。
  • d=0 不是定义吗?
  • 这是一个作业
  • @Akim 你真的能谈谈简单变量的定义吗?我会称之为作业。
  • 这确实回答了这个问题(由 OP 在他们的回答中确认)。 Why is creating a variable using 'extern' a declaration and not a definition?我不想删除这个问题,但在我的观点中,关闭重复是一个合适的状态,所有代表更改都会保留。

标签: c extern linkage


【解决方案1】:

感谢大家的cmets。我的错误是假设extern double d 以与double d 相同的方式定义变量。但显然不是。

我会说这是该语言的非直观属性,至少对于初学者来说是这样(例如,extern double 不是定义,但 static double 是)。

在您的 cmets 之后,我发现了一个相关问题,该问题与此完全相关:Why is creating a variable using 'extern' a declaration and not a definition?

【讨论】:

    【解决方案2】:

    你的理解是错误的。带有extern 的变量不需要在函数中定义。但它必须在某个地方定义(可能是另一个源文件)。

    例子:

    main.c:

    extern double d;
    int main(void) {
        d = 0;
        return 0;
    }
    

    d.c:

    double d;
    

    编译:

    gcc -o main main.c d.c
    

    【讨论】:

    • 谢谢,但它们仍然可以在函数中定义吗?这就是我现在正在做的事情。
    • @Akim 没有。您可以在函数中定义名为d 的变量,但它与extern double d; 不同,只是共享名称。
    • @Akim 函数中只能定义局部变量。
    猜你喜欢
    • 2019-08-30
    • 2013-01-30
    • 2014-08-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-12-28
    • 2015-03-18
    相关资源
    最近更新 更多