在源文件中使用static / extern有什么用?

时间:2015-01-15 17:58:10

标签: c static scope extern multiple-files

我对编译多个文件时发生的事情有一个非常复杂的概念 - 主要是涉及从一个文件到另一个文件的事物的可见性。根据我的阅读,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

3 个答案:

答案 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个文件。