#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值,但它给了我一个错误。我正确的这样做了吗?
答案 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);
}