我对编译多个文件时发生的事情有一个非常复杂的概念 - 主要是涉及从一个文件到另一个文件的事物的可见性。根据我的阅读,static
将变量或函数的范围限制为文件本身。 extern
反其道而行之。从那以后我希望能够从任何文件中读取全局extern 。虽然如下所示,但这在实践中并不起作用。
main.c中:
#include <stdio.h>
int main(void){
printf("%d\n", b); // b is extern global
return 0;
}
交流转换器:
static int a = 40;
b.c:
extern int b = 20;
我甚至无法编译:
> gcc main.c a.c b.c -o test
b.c:1:12: warning: ‘b’ initialized and declared ‘extern’ [enabled by default]
extern int b = 20;
^
main.c: In function ‘main’:
main.c:4:20: error: ‘b’ undeclared (first use in this function)
printf("%d\n", b); // b is extern global
答案 0 :(得分:1)
你做错了。当我们写extern int b
时,它意味着已经声明了一个名为b
的整数类型变量。我们可以根据需要多次执行此声明。 (记住,声明可以做任意次。)。通过外部变量,我们可以在程序中的任何地方使用变量,只要我们知道它们的声明,并且变量在某处定义。
正确的方法是
<强> main.c中:强>
#include <stdio.h>
extern int b; //declaration of b
int main(void){
printf("%d\n", b); // using b
return 0;
}
<强> b.c:强>
int b = 20; //definition here
并编译为gcc main.c b.c -o test
我省略了一个c,因为它在这个例子中什么都不做。 要了解有关外部人员的更多信息,请参阅此网站。内容非常好http://www.geeksforgeeks.org/understanding-extern-keyword-in-c/
答案 1 :(得分:0)
如果声明或定义了变量,则可以使用该变量。
在main.c
中,没有b
的声明。你可以添加
extern int b;
main.c
中的,以便编译器能够使用b
。这向编译器声明b
在其他地方定义,并且类型为int
。
在b.c
中,您可以删除extern
一词。除非获得static
限定,否则默认为extern
。
int b = 20;
即使在b.c
中,您也可以在文件顶部使用声明并在底部定义。
extern int b;
//
// ... code that uses b
//
int b = 20;
extern
行只是声明变量。最后一行定义变量。
答案 2 :(得分:0)
当你有一个extern
变量时,编译器知道这个变量的声明在这里,定义在其他地方。
所以你可以做如下所示
<强> some.h 强>
extern int b; /* Declare the variable */
<强> b.c 强>
int b = 20; /* Define the variable */
<强>的main.c 强>
#include<some.h>
int main()
{
printf("%d\n",b); /* Use the variable b */
return 0;
}
现在,文件main.c知道b
的声明,因为它有some.h
个文件。