在C编程语言中,外部变量是在任何功能块外定义的变量。请阅读关于extern变量(例如,here)。
此外,变量有范围。例如,它可以是局部变量,全局变量等。您可以阅读关于here的更多信息。
因此,您在这里所做的是在函数call()
中声明函数范围变量,而不使用extern关键字的强度来定义它。换句话说,只是告诉编译器该变量已经存在。最重要的是,您在函数main()
中声明并定义了另一个函数作用域变量,它具有相同的名称。理解这些变量完全不同是很重要的。因此,在一天结束时,当您链接程序时,找不到函数call()
的变量b
的定义。你宣布但没有定义,记得吗?
以下是可能的解决方案。不要声明多个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中的extern变量。
而顺便说一下,你的函数call()
被声明为int
返回类型,但什么都不返回。
希望它有帮助!
已经问过100个问题的人应该确定知道在发布之前他们会*缩进他们的代码。 –
对不起!希望我不会再这样做 – niko