其他文件中的extern变量定义

时间:2015-09-30 11:10:20

标签: c linux static extern

您好我有2个文件 在a.c我有

#include <stdio.h>

int i;
static int j;
int main()
{
        printf("i = %d\n",i);
        printf("j = %d\n",j);
        return 0;
}

并在b.c我有

#include <stdio.h>

extern int i=2;
extern int j=5;

在这个例子中,当我运行时,我得到的答案是2.0,但是编译器会为两个变量发出警告initialized and declared ‘extern’

b.c如何能够访问j而不会抛出错误,因为j的范围仅适用于a.c

3 个答案:

答案 0 :(得分:1)

首先,在将其声明为extern的同时初始化变量没有任何意义。这就是你得到编译器警告的原因。如果变量在文件范围内,C允许它,但一如既往,C允许许多不好的事情。

另请注意,使用extern几乎总是不好的做法,应该避免使用。

现在对于代码,i的行为与预期一致,因为两个文件中的i都引用相同的变量。另一方面,jstatic,因此该变量的范围缩小为本地文件。标准中有一条规则,即除非程序员明确地初始化它们,否则必须将所有静态变量初始化为0。因此j的值将为0.

由于j是静态的,extern int j;引用“另一个j在其他地方”,因为您编写extern的文件中没有j变量可见。由于程序不使用“其他j在其他地方”,因此该变量将被丢弃。

staticextern在很多方面彼此对立。如果您认为将静态和外部相同的变量声明为有意义,则需要更多地研究静态关键字。

答案 1 :(得分:0)

交流转换器

#include <stdio.h>
int i;
static int j;
extern void display();
int main()
{
        printf("i = %d\n",i);
        printf("j = %d\n",j);
        display();
        return 0;
}

b.c

#include <stdio.h>
extern int i;
extern int j;

void display()
{
     printf ("%d",j);
}

C.C

#include <stdio.h>
extern int i=2;
extern int j=5;
void display()
{
   printf ("%d",j);
}

如果编译a.c和b.c,GCC会抱怨

  

未定义对`j'的引用。

因为程序试图访问未在b.c范围内定义的j

如果你编译了a.c和c.c,GCC会按你所说的那样发出警告

  

警告:'初始化并声明âexternâ

并假定在c.c中定义j并且不会抛出任何错误。

在你的情况下如果删除b.c中的赋值,你在编译时就不会发现任何错误,因为在b.c中没有函数可以访问j的值。

答案 2 :(得分:0)

如果没有另外说明,

createPartControl()数据默认用static初始化,这就是为什么你得到0作为答案,它与b.c模块无关。另外一个变量不能同时声明0static,听起来像是一个矛盾。

使用extern时,您应该只声​​明一个变量(没有设置空格以将其保存在内存中),该变量的定义将在其他模块中。以一种简单的方式extern告诉编译器,嘿不要担心它在模块中其他地方定义的变量,所以不要为它设置任何空间。

为什么编译器不会抛出错误? b.c是否在程序中与a.c链接?尝试这样做,看看会发生什么。