c语言extern的作用6,C语言中extern用法详解
本文基于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用法详解相关推荐
- c语言中funx的作用,c语言中fun用法详解
C语言中fun用法详解 fun函数是自定义的C/C++语言函数,函数功能多样.该函数名为"函数"英文function的简写,一般在示例和试题中使用,通常在主函数中被调用. C/C+ ...
- java 函数fun_c语言中fun用法详解_后端开发
Java Dao层的作用_后端开发 Dao层叫数据访问层,属于一种比较底层,比较基础的操作,可以具体到对于某个表或某个实体的增删改查,其Dao层的作用是对数据库的访问进行封装,从而不涉及业务,实现解耦 ...
- C语言中const用法详解
C语言中const用法详解 const修饰普通变量 const作用在于定义一个常量,比如const int a = 10,代表a的值不能被直接修改了,是一个常量,但仍可以通过指针的方式间接修改,如下图 ...
- C语言中typedf函数的用法,C语言中typedef用法详解
在C语言中,经常有如下的用法: typedef struct tag{ ...} MyType, *MyPtr; 一旦通过如上定以后,就可以用MyType来定义struct tag结构了. 以 ...
- C语言中static用法详解
提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言 一.static修饰变量 1.修饰局部变量 2.修饰全局变量 二.static修饰函数 总结 前言 static关键字 ...
- c语言getline作用,C++ cin.getline及getline()用法详解
下面先看下C++ cin.getline用法,具体内容如下所示: 使用 C++ 字符数组与使用 string 对象还有另一种不同的方式,就是在处理它们时必须使用不同的函数集.例如,要读取一行输入,必须 ...
- python中values作用_Python values()与itervalues()的用法详解
dict 对象有一个 values() 方法,这个方法把dict转换成一个包含所有value的list,这样,我们迭代的就是 dict的每一个 value: d = { 'Adam': 95, 'Li ...
- _nop_在c语言里什么作用,单片机c语言中nop函数的使用方法和延时计算
原标题:单片机c语言中nop函数的使用方法和延时计算 标准的C语言中没有空语句.但在 的C语言编程中,经常需要用几个空指令产生短延时的效果. 这在汇编语言中很容易实现,写几个nop就行了. 在C51中 ...
- c语言new的作用,关于c语言中new的使用?
必须使用malloc函数,因为C语言没有new这个操作符,但是如果你的编译器是C++的话,是可以使用new的. 所以程序就是: long *pNumber = (long*)malloc(sizeof ...
最新文章
- 【Android 逆向】ART 脱壳 ( InMemoryDexClassLoader 脱壳 | InMemoryDexClassLoader 类加载器脱壳点总结 )
- Spring Validation 校验
- Linux 运维入门到跑路书单推荐
- 【Spring】SpringMVC 作用域传值的 4 种方式
- 11相机不流畅_小米11有望本月发布,小米10退位让贤,256GB版本跌至3799
- ibm量子计算机 申请,【IBM量子计算机问世,造福人类的杰作!】IBM量子计算机已面前全球开放申请使用_来自网易大神圈子_科学企图玄学...
- 一文看懂PPPoE协议——PPPoE协议简介
- Java语法总结 - 线程
- MTK6589平台——“长按powerkey重启”feature不工作问题的解决
- 使用Matlab对大地测量学中的大地坐标和大地空间直角坐标进行相互转换
- python OpenCV 颜色通道问题 子图颜色异常问题
- c语言wakeup函数,关于RTC时钟RTC_Set_WakeUp(u32 wksel,u16 cnt)函数的疑惑
- 乌隆他尼皇家大学举办建校98周年校庆表彰大会
- 热电偶 matlab,基于MATLAB的陶瓷窑炉温度与热电偶热电势关系的数学模型研究
- 微信世界争霸服务器,微信世界争霸小程序进不去游戏怎么办
- spring2.5.6升级到4.3.7常见问题
- 如何在 Linux下从普通用户切换到root用户
- 脂肪体重器、手环、NFC手机
- linux nfs 拒绝挂载,mount:被服务器拒绝的nfs访问
- mysql删除表中所有数据