您的位置:首页 > 编程语言 > C语言/C++

c语言3种链接属性: 外部(external), 内部(internal),无设置(none)

2017-11-21 19:27 393 查看
c语言中,多个文件组合的时候,有可能标示名相同,那么这个时候编译器如何判别的呢?

c语言中有3种链接属性: 外部(external:可以被其他文件访问到), 内部(internal:无法被其他文件访问到),无设置(none)

    外部(external):使用extern关键字

    内部(internal ):使用static关键字

   

小结一下:

1.extern的修饰的符号,必须在工程的其他文件中要有一个变量的定义,否则不能被使用。

2.extern使用之后可是实现全部工程的不同文件使用相同的变量

3.internal的属性方式,通过static来进行修饰仅仅是在改文件中可以使用,但是在其他的文件中则不能访问。

 对各种情况进行一些测试吧

 第一步测试,在两个文件中定义相同名称的变量

    unit1.c

    --------------------

int a = 10;

void printtest1()

{

 printf("print test at %s, variable a = %d/n", __FILE__, a);

}

    unit2.c

 -------------------

int a = 20;

void printtest2()

{

 printf("print test at %s, variable a = %d/n", __FILE__, a);

}

    main.c

 ------------------

void printtest1();

void printtest1();

int main(int argc, char *argv[])

{

 printtest1();

 printtest2();

 system("PAUSE"); 

 return 0;

}

   编译时提示错误 unit2.c multiple definition of 'a' ,由于unit1.c和unit2.c都定义了a

   第一步测试结论:如果在不同的文件中定义相同名字的变量,编译器无法通过编译

============================================================================================ 

   第二步测试,把其中一个声明改成extern 

   这个时候把unit2.c改造一下

extern int a;

void printtest2()

{

 printf("print test at %s, variable a = %d/n", __FILE__, a);

}

   unit2中使用extern标示该变量是外部链接的, 这样编译通过了,结果显示unit1和unit2中a的值都为10,OK,值相同了,那么真的是同一个变量了吗,修改一下值再确认一下

   改造一下main.c,修改a的值

extern int a;

a = 20;

printtest1();

printtest2();

a = 30;

printtest1();

printtest2();

 这个时候输出为

 unit1.c   20

 unit2.c   20

 unit1.c   30

 unit2.c   30

 可以确认的确是使用了同一个变量了。

 第二步测试结论;使用extern可以访问其他文件中定义的变量

 ============================================================================================ 

 第三步测试把其中一个声明使用static标示

 首先在unit1.c这把a声明成static,个时候编译器提示main.c和unit2.c中的a未定义,static把unit1.c中的a定义为文件内部使用范围,unit2.c和main.c中无法访问到该变量。

 把uint2.c中的声明修改成int a;

 这个时候输出为

 unit1.c   10

 unit2.c   20

 unit1.c   10

 unit2.c   30

    OK,结果显示unit1.c中的a和unit2.c中的a互相不影响了。再测试一下,在unit1.c中使用extern int a,看看能不能引用到unit2.c中的变量

void printtest1()

{

 extern int a;

 a = 10;

 printf("print test at %s, variable a = %d/n", __FILE__, a);

}

    这个时候输出为

 unit1.c   10

 unit2.c   20

 unit1.c   10

 unit2.c   30

    可以确认unit1.c中使用的a都是本文件内定义的变量,无法影响到unit2.c中的变量了。

 第三步测试结论:使用static标示的变量在文件内部有效,其他文件中无法访问。并且在该文件中无法引用到其他文件的同名称变量

 ============================================================================================ 

 第四步测试,两个文件都设置成extern

 如果在unit1.c和unit2.c中都申明成extern会怎么样呢?

    unit1.c

    --------------------

extern int a;

void printtest1()

{

 printf("print test at %s, variable a = %d/n", __FILE__, a);

}

    unit2.c

 -------------------

exntern int a;

void printtest2()

{

 printf("print test at %s, variable a = %d/n", __FILE__, a);

}

 这个时候所有使用a的地方都报编译错误,提示没有定义变量。

 第四步测试结论:使用extern标示的变量必须已经定义过。

 ============================================================================================ 

 第五步,测试static标示的函数

 把unit1.c中的printtest1修改成static

 static void printtest1()

 这时编译器报错,main.c中使用的printtest1未定义。

 第5步测试结论:使用static标示的函数,在其他文件中不能访问。

 ============================================================================================ 

 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息