本文基于VC6.0 编译器

首先文档结构如下:

myextern.h和myextern.c中定义extern函数

main.c中定义main方法,调用extern函数

1.第一个尝试:

myextern.h: void print();

myextern.c: void print(){..}

main.c: extern void print();

并且main(){print()};成功,警告错误均无

说明extern的作用是,声明本模块中的print()是来自其他模块(myextern.c)的

2.第二个尝试:

myextern.h: extern void print();

myextern.c: print(){..}

main.c: extern void

print();并且main(){print()}也没问题,警告错误均无

3.第三个尝试:

myextern.h: extern void print();

myextern.c: print(){..}

main.c: void

print();并且main(){print()}也没问题,警告错误均无

4.第四个尝试:

myextern.h: void print();

myextern.c: print(){..}

main.c: void print();并且main(){print()},

也没问题,警告错误均无

5.第五个尝试:

myextern.h: void print();

myextern.c: print(){..}

main.c:

不声明print(),直接main(){print()},编译时无错误问题,但是有警告:'print' undefined;

assuming extern returning

int。但是链接时正确,无错误也无警告,另外可以看出,编译器是默认assume它是extern的,这也是接下来6,7两个尝试证明的东西:

6.第六个尝试:

myextern.h: extern void print();

myextern.c: print(){..}

main.c: extern

print();并且再次实现print(){..}然后main(){print()},编译时错误:print()重定义了

7.第七个尝试:

myextern.h: void print();

myextern.c: print(){..}

main.c:

print();并且再次实现print(){..}然后main(){print()},编译时错误:print()重定义了

由上述尝试,可以得出结论:无论你有没有声明extern,

当你没有使用static的时候,编译器默认所有模块声明的函数都是extern的,在整个工程命名空间里面,函数是不能重定义的,但是可以重复声明,即:在同一命名空间里,只能有一个函数的实现,比如:你可以:a.h:

extern void f(); b.h: extern void

f(); c.h: extern void f(); d.h:void f(); 但是,在a.c, b.c, c.c, d.c

中,你只能有一个函数实现,不然,不管过不过的到编译这关,链接的时候肯定会报错,因为你redefinition了~~。

另外注意,不要企图用static void

f();声明来区分命名空间,static不能分割可见域,static的作用在于它可以分割作用域,即,其他模块不能使用到static

void f();但是,其他模块对于static void f()是可见的,在它们内部,可以声明void

f(),但是不能重新对f()进行实现。

发现vc的一个bug:

a.c:

void print()

{

printf("myextern printf \n");

}

main.c:

void print()

{

printf("this main's print\n");

}

void main()

{

print();

}

结果是:函数执行的结果很随机:有时候是myextern printf, 有时候是this main's

print, 有时候链接出错。 很奇怪,不知道是VC的bug,还是有理解问题

c语言extern的作用6,C语言中extern用法详解相关推荐

  1. c语言中funx的作用,c语言中fun用法详解

    C语言中fun用法详解 fun函数是自定义的C/C++语言函数,函数功能多样.该函数名为"函数"英文function的简写,一般在示例和试题中使用,通常在主函数中被调用. C/C+ ...

  2. java 函数fun_c语言中fun用法详解_后端开发

    Java Dao层的作用_后端开发 Dao层叫数据访问层,属于一种比较底层,比较基础的操作,可以具体到对于某个表或某个实体的增删改查,其Dao层的作用是对数据库的访问进行封装,从而不涉及业务,实现解耦 ...

  3. C语言中const用法详解

    C语言中const用法详解 const修饰普通变量 const作用在于定义一个常量,比如const int a = 10,代表a的值不能被直接修改了,是一个常量,但仍可以通过指针的方式间接修改,如下图 ...

  4. C语言中typedf函数的用法,C语言中typedef用法详解

    在C语言中,经常有如下的用法: typedef struct  tag{    ...} MyType, *MyPtr; 一旦通过如上定以后,就可以用MyType来定义struct tag结构了. 以 ...

  5. C语言中static用法详解

    提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言 一.static修饰变量 1.修饰局部变量 2.修饰全局变量 二.static修饰函数 总结 前言 static关键字 ...

  6. c语言getline作用,C++ cin.getline及getline()用法详解

    下面先看下C++ cin.getline用法,具体内容如下所示: 使用 C++ 字符数组与使用 string 对象还有另一种不同的方式,就是在处理它们时必须使用不同的函数集.例如,要读取一行输入,必须 ...

  7. python中values作用_Python values()与itervalues()的用法详解

    dict 对象有一个 values() 方法,这个方法把dict转换成一个包含所有value的list,这样,我们迭代的就是 dict的每一个 value: d = { 'Adam': 95, 'Li ...

  8. _nop_在c语言里什么作用,单片机c语言中nop函数的使用方法和延时计算

    原标题:单片机c语言中nop函数的使用方法和延时计算 标准的C语言中没有空语句.但在 的C语言编程中,经常需要用几个空指令产生短延时的效果. 这在汇编语言中很容易实现,写几个nop就行了. 在C51中 ...

  9. c语言new的作用,关于c语言中new的使用?

    必须使用malloc函数,因为C语言没有new这个操作符,但是如果你的编译器是C++的话,是可以使用new的. 所以程序就是: long *pNumber = (long*)malloc(sizeof ...

最新文章

  1. 【Android 逆向】ART 脱壳 ( InMemoryDexClassLoader 脱壳 | InMemoryDexClassLoader 类加载器脱壳点总结 )
  2. Spring Validation 校验
  3. Linux 运维入门到跑路书单推荐
  4. 【Spring】SpringMVC 作用域传值的 4 种方式
  5. 11相机不流畅_小米11有望本月发布,小米10退位让贤,256GB版本跌至3799
  6. ibm量子计算机 申请,【IBM量子计算机问世,造福人类的杰作!】IBM量子计算机已面前全球开放申请使用_来自网易大神圈子_科学企图玄学...
  7. 一文看懂PPPoE协议——PPPoE协议简介
  8. Java语法总结 - 线程
  9. MTK6589平台——“长按powerkey重启”feature不工作问题的解决
  10. 使用Matlab对大地测量学中的大地坐标和大地空间直角坐标进行相互转换
  11. python OpenCV 颜色通道问题 子图颜色异常问题
  12. c语言wakeup函数,关于RTC时钟RTC_Set_WakeUp(u32 wksel,u16 cnt)函数的疑惑
  13. 乌隆他尼皇家大学举办建校98周年校庆表彰大会
  14. 热电偶 matlab,基于MATLAB的陶瓷窑炉温度与热电偶热电势关系的数学模型研究
  15. 微信世界争霸服务器,微信世界争霸小程序进不去游戏怎么办
  16. spring2.5.6升级到4.3.7常见问题
  17. 如何在 Linux下从普通用户切换到root用户
  18. 脂肪体重器、手环、NFC手机
  19. linux nfs 拒绝挂载,mount:被服务器拒绝的nfs访问
  20. mysql删除表中所有数据

热门文章

  1. 安装软件包的三种方法、rpm包介绍、rpm、yum工具用法与yum搭建本地仓库
  2. 7-2 哥德巴赫猜想
  3. 使用 curl 下载需要太长时间?试试在 cURL 中设置超时
  4. MAC软件打开提示:已损坏,打不开 您应该将它移到废纸娄的解决方法
  5. 基于java所写的学生选课管理系统
  6. 亚马逊、微软、谷歌最新财报出炉,云业务上演“神仙打架”?
  7. 如何删除讨厌的微软拼音输入法
  8. Android开发经验—不要指望类的finalize方法干你想要干的活
  9. Harbor对接OIDC
  10. 图像中的目标检测学习笔记(一)