为什么它会返回错误?

时间:2011-09-30 13:11:46

标签: c

#include <stdio.h>
int call()
{
    extern int b;
    b=10;
    printf("%d",b);
}

int main ()
{
    int b=8;
    call();
    return 0;
}

为什么会抛出这样的错误我是否收到以下链接器错误:

 /tmp/ccAsFhWX.o:meka.c:(.text+0x7): undefined reference to `_b' collect2: ld returned 1 exit status

我想使用extern关键字更改另一个函数中的b值,但它给了我一个错误。我正确的这样做了吗?

3 个答案:

答案 0 :(得分:7)

声明extern int b将其声明为.... extern。它必须在别处定义。如果不是,请删除extern关键字?

我想你想要一个全局变量:

#include <stdio.h>

static int b;

int call()
{
    b=10;
    printf("%d",b);
}

int main ()
{
    b=8;
    call();
    return 0;
}

如果您将全局b声明为extern,您可以获得在其他地方(可能在另一个翻译单元(helpers.c)或库(helpers.a)中定义它的可能性(以及职责) )等。)

答案 1 :(得分:1)

在C编程语言中,外部变量是在任何功能块之外定义的变量。请阅读有关外部变量的信息(例如here)。

此外,变量具有范围。例如,它可以是局部变量,全局变量等。您可以阅读有关here的更多信息。

所以你在这里所做的是在函数call ()中声明一个函数作用域变量,而不使用extern关键字的强大功能来定义它。换句话说,只是告诉编译器变量已存在于某处。最重要的是,您在函数main ()中声明并定义了另一个函数作用域变量,它具有相同的名称。重要的是要理解这些变量是完全不同的。因此,在一天结束时,当您链接程序时,找不到函数b的变量call ()的定义。你声明了但从未定义过,记得吗?

以下是可能的解决方案。不要声明多个b变量,因为这显然不是您的意图。坚持使用单一声明和定义:

#include <stdio.h>    

extern int b;

void call()
{
    b = 10;
    printf("%d\n",b);
}

int b = 8;

int main () {  
    call();
    return 0;     
} 

但全局变量通常非常糟糕 - 全局范围使它们非常pipeline unfriendly,引入了线程问题等。所以你必须考虑这样的事情:

#include <stdio.h>    

void call (int *b)
{
    printf ("%d\n", *b = 10);
}

int main () {  
    int b = 8;
    call (&b);
    return 0;     
} 

我还建议您阅读the following question and answers here。它解释了很多关于C中的外部变量。

顺便说一下,函数call ()声明为int返回类型,但什么都不返回。

希望它有所帮助!

答案 2 :(得分:0)

要更改main()中的“b”,您必须将指针传递给call (&b)之类的“call”,然后执行

void call (int *b) {
    *b = 10;
    printf("%d",*b);
}