extern关键字的测试

原创 2016年09月01日 08:54:17

新建test_h.h文件,内容如下:

#ifndef __TEST_H__
#define __TEST_H__
char  a='a';
#endif


新建change_a.c文件,内容如下:

#include "test_h.h"
void change_a(){
 extern char a;
 a='c';
 return 0;
}


新建hello.c文件,内容如下:

#include <stdio.h>
#include "change_a.c"
#include "test_h.h"
int main(void){
 extern char a;// a is exist
 printf("hello,world,Linux programming ! %C \n",a);
 change_a();
 printf("hello,world,Linux programming ! %C \n",a);
 return 0;
}

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

测试1:

输入gcc hello.c -o hello

输入./hello

打印结果:
hello,world,Linux programming ! a
hello,world,Linux programming ! c

结论:加载stdio.h文件,加载 change_a.c文件,没有调用change_a()函数,加载test_h.h文件。此时a='a';

---进入main()函数。

---从全局变量中获取变量a

---打印出a的值。

---调用change_a()函数,从全局变量中获取a,赋值 a='c';

---打印出a的值。

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

测试2:在测试1的环境基础上,注释掉 test_h.h 中对a的定义。

 

#ifndef __TEST_H__
#define __TEST_H__
 //char  a='a';
#endif
执行 测试1 的操作:

打印结果:

/tmp/ccovgj70.o: In function 'change_a':

hello.c:(.text+0x6): undefined reference to 'a'

/tmp/ccovgj70.o: In function 'main':

hello.c:(.text+0x14): undefined reference to 'a'

hello.c:(.text+0x39): undefined reference to 'a'

collect2: error :ld returned 1 exit status

结论:change_a()函数和main()函数都没有定义变量a。

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

测试3 ,在测试1环境的基础上,在 change_a.c 中再定义一个变量 a

#include "test_h.h"
char a='d';
void change_a(){
 extern char a;
 a='c';
 return 0;
}

执行 测试1 :

打印结果:

In file included from hello.c:2:0:
change_a.c:2:6: error: redefinition of ‘a’
 char a='d';
      ^
In file included from change_a.c:1:0,
                 from hello.c:2:
test_h.h:3:8: note: previous definition of ‘a’ was here
  char  a='a';
结论:重复的定义了变量a。
------------------------------------------------------------------------

测试4,在测试1的环境基础上, 更改test_h.h 文件:

#ifndef __TEST_H__
#define __TEST_H__
char  a;
#endif

执行 测试1 :

打印结果:

hello,world,Linux programming ! 
hello,world,Linux programming ! c

结论:参考 测试1 结论。

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

测试5 ,在测试1的环境基础上,新建test_h.c 文件:

#include "test_h.h"
extern char a='t';

执行 测试 1:

打印结果:

hello,world,Linux programming ! 
hello,world,Linux programming ! c

结论:参考 测试1 这是hello.c没有加载test_h.c文件,所以并没有改变a的值。
----------------------------------------------------------------------

测试6 ,在测试5的环境基础上,更改hello.c文件:

#include <stdio.h>
#include "change_a.c"
#include "test_h.c"
int main(void){
 extern char a;// a is exist
 printf("hello,world,Linux programming ! %C \n",a);
 change_a();
 printf("hello,world,Linux programming ! %C \n",a);
 return 0;
}

执行测试1:

打印结果:

xiaoming@ubuntu:~/Downloads/c_test$ gcc hello.c -o hello
In file included from hello.c:3:0:
test_h.c:2:13: warning: ‘a’ initialized and declared ‘extern’ [enabled by default]
 extern char a='t';
xiaoming@ubuntu:~/Downloads/c_test$ ./hello
hello,world,Linux programming ! t 
hello,world,Linux programming ! c 

结果:编译时出现一个警告,大概是a的初始化不能使用 extern 关键字吧。但是还是初始化成功了。

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

测试7,在测试6的环境基础上,更改test_h.c文件

#include "test_h.h"
#ifndef __TEST_H__
#define __TEST_H__
extern char  a='t';
#endif
执行测试1:

打印结果:

hello,world,Linux programming ! 
hello,world,Linux programming ! c

结果:使用宏作为判断,此时未对a做初始化操作。
------------------------------------------------------------------

测试8,在测试7的基础上,更改test_h.c文件

#include "test_h.h"
char  a='t';
执行 测试1 :

打印结果:

hello,world,Linux programming ! t
hello,world,Linux programming ! c

结果:参考测试6, 此时没有使用extern 关键字,没有出现警告。

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

测试9,在测试8的基础上,更改change_a.c文件

#include "test_h.c"
void change_a(){
extern char a;
a='c';
return 0;
}

执行 测试1 :

打印结果:

xiaoming@ubuntu:~/Downloads/c_test$ gcc hello.c -o hello
In file included from hello.c:3:0:
test_h.c:2:6: error: redefinition of ‘a’
 char a='t';
      ^
In file included from change_a.c:1:0,
                 from hello.c:2:
test_h.c:2:6: note: previous definition of ‘a’ was here
 char a='t';
      ^
结论:重复的定义了变量a,报错。




extern 关键字的作用

** extern的作用**demo.h 头文件#ifndef _DEMO_H #define _DEMO_H#ifdef __cplusplus extern "C"{ #en...
  • chenhittler
  • chenhittler
  • 2015年10月09日 10:50
  • 1141

extern关键字的一般用法

extern关键字会提升变量或者函数的逼格,使得它们可以跨文件被访问。话虽然是这么说,使用这个关键字必须要注意一些东西。 首先,你得在cpp文件里面实现这些全局变量和全局函数,这是最基本的,然后只需要...
  • lishuhuakai
  • lishuhuakai
  • 2015年05月24日 03:02
  • 8072

C语言中关键字extern的作用

 1 基本解释   extern可以置于变量或者函数前,以标示变量或者函数的定义在别的文件中,提示编译器遇到此变量和函数时在其他模块中寻找其定义。   另外,extern也可用来进行链接指定。2 问题...
  • xiaozhi_su
  • xiaozhi_su
  • 2009年05月09日 13:56
  • 13151

extern 关键字 声明和定义的区别

extern实际上就两种用法,就是后面加不加C 一,后面加C如: extern "C" void fun(int a, int b);就是告诉编译器在编译fun这个函数名时按着C的规则去翻译相应的函数...
  • u011676589
  • u011676589
  • 2013年08月17日 16:40
  • 2082

extern 关键字用法

class CsssApp : public CWinApp{public: CsssApp();// Overridespublic: virtual BOOL InitInstance();// ...
  • id19870510
  • id19870510
  • 2010年02月23日 15:39
  • 2965

变量的声明和定义的关系、extern关键字的使用

变量声明规定了变量的名字和类型,定义还申请存储空间,也可能会为变量赋一初值。 注意: 变量可以声明很多次,但定义只能定义一次,否则编译器将会报错。 在编写复杂程序时,会有许多文件,需要有...
  • xiaoyuxianshenging
  • xiaoyuxianshenging
  • 2017年02月10日 10:28
  • 805

extern关键字的几种作用

1.修饰变量如: extern int GCount;
  • freeangeles
  • freeangeles
  • 2014年05月27日 11:08
  • 1068

stm32f103学习笔记——关键字extern、static、const

1、extern extern放在变量和函数声明之前,表示该变量或者函数在别的文件中已经定义,提示编译器在编译时要从别的文件中寻找。除此之外,extern还可以用来进行链接指定。 (1) 声明外部变量...
  • Lang_Billow
  • Lang_Billow
  • 2015年04月06日 21:07
  • 2040

C#中extern的作用

C# extern 在方法声明中使用extern修饰符支持在外部实现方法。 C# extern 在方法声明中使用extern修饰符支持在外部实现方法。外部修饰符的常见方法是在使用In...
  • yhj198927
  • yhj198927
  • 2017年05月23日 14:26
  • 197

iOS开发中的关键字const/static/extern

关键字const/static/extern的释义和用法  1、const 这个单词翻译成中文是“常量”的意思。在程序中我们知道“常量”的值是不能变的,固定的。所以const关键字的作用就...
  • Xia0Liang
  • Xia0Liang
  • 2016年11月11日 10:23
  • 522
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:extern关键字的测试
举报原因:
原因补充:

(最多只允许输入30个字)