extern 的实用方法
2014-05-19 15:58
169 查看
extern可以置于变量或者函数前,以标示变量或者函数的定义在别的文件中,提示编译器遇到此变量和函数时在其他模块中寻找其定义。
另外,extern也可用来进行链接指定。
1. 在源文件A里定义的函数,在其它源文件里是看不见的(即不能访问)。为了在源文件B里能调
用这个函数,应该在B的头部加上一个外部声明:extern
函数原型;
这样,在源文件B里也可以调用那个函数了。
2.extern用在变量声明中常常有这样一个作用,你在*.c文件中声明了一个全局的变量,这个全局的变量如果要被引用,就放在*.h中并用extern来声明。
3.如果定义函数的c/cpp文件在对应的头文件中声明了定义的函数,那么在其他c/cpp文件中要使用这些函数,只需要包含这个头文件即可。
如果你不想包含头文件,那么在c/cpp中声明该函数。一般来说,声明定义在本文件的函数不用“extern”,声明定义在其他文件中的函数用“extern”,这样在本文件中调用别的文件定义的函数就不用包含头文件
include “*.h”来声明函数,声明后直接使用即可。
4.问题:extern
“C”
在C++环境下使用C函数的时候,常常会出现编译器无法找到obj模块中的C函数定义,从而导致链接失败的情况,应该如何解决这种情况呢?
答案与分析:
C++语言在编译的时候为了解决函数的多态问题,会将函数名和参数联合起来生成一个中间的函数名称,而C语言则不会,因此会造成链接时找不到对应函数的情况,此时C函数就需要用extern
“C”进行链接指定,这告诉编译器,请保持我的名称,不要给我生成用于链接的中间函数名。
下面是一个标准的写法:
//在.h文件的头上
#ifdef __cplusplus
#if __cplusplus
extern "C"{
#endif
#endif
…
…
//.h文件结束的地方
#ifdef __cplusplus
#if __cplusplus
}
#endif
#endif
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
注意:一个文件1中 变量声明为 静态 static或函数声明为static 时
就不可以被别的文件2 引用,别的文件2只能通过文件1中的非静态函数 来操作 文件1中的 静态变量
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
另外,extern也可用来进行链接指定。
1. 在源文件A里定义的函数,在其它源文件里是看不见的(即不能访问)。为了在源文件B里能调
用这个函数,应该在B的头部加上一个外部声明:extern
函数原型;
这样,在源文件B里也可以调用那个函数了。
2.extern用在变量声明中常常有这样一个作用,你在*.c文件中声明了一个全局的变量,这个全局的变量如果要被引用,就放在*.h中并用extern来声明。
3.如果定义函数的c/cpp文件在对应的头文件中声明了定义的函数,那么在其他c/cpp文件中要使用这些函数,只需要包含这个头文件即可。
如果你不想包含头文件,那么在c/cpp中声明该函数。一般来说,声明定义在本文件的函数不用“extern”,声明定义在其他文件中的函数用“extern”,这样在本文件中调用别的文件定义的函数就不用包含头文件
include “*.h”来声明函数,声明后直接使用即可。
4.问题:extern
“C”
在C++环境下使用C函数的时候,常常会出现编译器无法找到obj模块中的C函数定义,从而导致链接失败的情况,应该如何解决这种情况呢?
答案与分析:
C++语言在编译的时候为了解决函数的多态问题,会将函数名和参数联合起来生成一个中间的函数名称,而C语言则不会,因此会造成链接时找不到对应函数的情况,此时C函数就需要用extern
“C”进行链接指定,这告诉编译器,请保持我的名称,不要给我生成用于链接的中间函数名。
下面是一个标准的写法:
//在.h文件的头上
#ifdef __cplusplus
#if __cplusplus
extern "C"{
#endif
#endif
…
…
//.h文件结束的地方
#ifdef __cplusplus
#if __cplusplus
}
#endif
#endif
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
注意:一个文件1中 变量声明为 静态 static或函数声明为static 时
就不可以被别的文件2 引用,别的文件2只能通过文件1中的非静态函数 来操作 文件1中的 静态变量
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
相关文章推荐
- XSLT中输出 的方法
- java indexOf方法
- SOA介绍  实现方法
- 8个实用的Linux netcat命令示例
- "ASP.NET 管理实用工具"使用方法
- Javascript 静态方法和常规方法
- java 类,方法,变量的说明符   pr…
- MySQL 升级方法指南大全
- Sublime Text 2 编辑器实用技巧
- XSLT中 的输出方法
- gridview中的" "问题解决方法
- net 与 javascript脚本的几种交互方法
- javascript 方法的使用
- PHP 时间 时区设置 方法
- tapestry不支持 等html特殊符号的解决方法
- Can't open file 'folder/.svn/tmp/text-base/file.svn-base': The system cannot find the file specified的实用解决方法
- js的replace方法将字符串中的 全部替换为空字符串
- 据库系统紧急故障处理方法 (…
- poj 1703_ 并查集+//方法同poj2492