c/c++ 中extern 关键字

详细参考http://www.cnblogs.com/yc_sunniwell/archive/2010/07/14/1777431.html

基本解释:

extern可以置于变量或者函数前,以标示该变量或者函数定义在其他的文件中,提示编译器遇到此变量或者函数时去其他模块寻找定义;此外extern也可以用来进行链接指定。


extern 变量

在一个源文件中定义一个数组:char a[] = “1234”;

在另一个文件中使用下列声明: extern char* a;

请问,这样可以吗? 分析:不可以,
1. 指向类型T的指针并不等价于类型T的数组。extern char *eChar声明的是一个指针变量而不是char型数组,从而造成运行时
非法访问。extern 遵从严格的声明!
2. 在.cpp文件中声明一个全局的变量,这个全局变量要被引用,就放在.h文件中使用extern声明;
这样避免了在使用该全局变量的源文件中都必须使用extern对该变量声明,只需包含该头文件即可。
3. 把声明和定义放在一起可能存在的问题,如:extern int eInt = 2;这时候相当于没有extern,如果把该语句放在某个头文件中,当有多个源文件引用该头文件时,编译时会在每个模块中都定义了一个eInt变量,当连接多个文件时会报错。

#ifndef _A_H
#define _A_H/*
在.cpp文件中声明一个全局的变量,这个全局变量要被引用,就放在.h文件中使用extern声明;
这样避免了在使用该全局变量的源文件中都必须使用extern对该变量声明,只需包含该头文件即可。
*/
extern int eInt ; //
// extern char *eChar; // a.cpp:4: error: conflicting declaration ‘char eChar []’// a.h:11: error: ‘eChar’ has a previous declaration as ‘char* eChar’
/*
指向类型T的指针并不等价于类型T的数组。extern char *eChar声明的是一个指针变量而不是char型数组,从而造成运行时
非法访问。extern 遵从严格的声明!
*/
extern char eChar[];
#endif
//a.cpp
#include "a.h"int eInt = 10;
char eChar[] = "123456";
//test.cpp
#include "a.h"
#include <iostream>
using namespace std;
// extern int eInt ;
int main(int argc, char const *argv[])
{cout<<++eInt<<endl;cout<<eChar<<endl;cout<<*eChar<<endl;return 0;
}

extern修饰函数

 如果函数的声明中带有关键字extern,仅仅是暗示这个函数可能在别的源文件里定义,没有其它作用。即下述两个函数声明没有明显的区别:
extern int f(); 和int f();
  当然,这样的用处还是有的,就是在程序中取代include “*.h”来声明函数。


实现C++与C的混合编程

被extern”C”修饰的变量和函数是按照C语言方式编译和连接的,未加extern “C”则按照声明时的编译方式。

//在C++中引用C语言中的函数和变量,在包含C语言头文件(假设为cExample.h)时,需进行下列处理:extern "C"{#include "cExample.h"}

在C中引用C++ 语言中的函数和变量时,C++ 的头文件需添加extern”C”,但是在C语言中不能直接引用声明了extern”C”的该头文件,应该仅将C文件中将C++ 中定义的extern”C”函数声明为extern类型。注意 c++ 中的类、多态、重载等C中不支持!!


c/c++ 中 extern 用法相关推荐

  1. C/C++中 extern用法

    一.定义和声明的区别 声明用来告诉编译器变量的名称和类型,而不分配内存,不赋初值. 定义为了给变量分配内存,可以为变量赋初值. 注:定义要为变量分配内存空间:而声明不需要为变量分配内存空间. 二.ex ...

  2. c++中extern用法-个人理解

    1.在头文件中外部声明 例 在test.h中 extern bool flag: 在test.cpp中外部定义 #include <test.h> bool flag = true; 在其 ...

  3. c++中extern用法总结

    extern关键字的作用是共享代码. 一个c++程序可以包含多个文件,在一个文件中已定义的变量,如果要在另一个文件中调用,就要先声明一下变量,此时用extern这个关键字来声明.(注意:在一个程序中, ...

  4. C/C++中extern的用法 ?

    C/C++中extern的用法 简介 extern修饰变量的声明. extern修饰函数声明. 使用extern和包含头文件来引用函数有什么区别呢? extern修饰符可用于指示C或者C++函数的调用 ...

  5. 几个比较好用的Windows API在C#中的用法。

    几个比较好用的Windows API在C#中的用法. #region Windows Api 定义 ///   /// 模拟鼠标事件   ///   /// 鼠标事件的Enum   /// X座标   ...

  6. C++中extern “C”含义深层探索(zz)

    1.引言 C++语言的创建初衷是"a better C",但是这并不意味着C++中类似C语言的全局变量和函数所采用的编译和连接方式与C语言完全相同.作为一种欲与C兼容的语言,C++ ...

  7. Re: Programming C/C++中extern C含义深层探索

    1.引言 C++语言的创建初衷是"a better C",但是这并不意味着C++中类似C 语言的全局变量和函数所采用的编译和连接方式与C 语言完全相同.作为一种欲与C 兼容的语言, ...

  8. extern用法详解(转)

    extern用法详解(转)       1 基本解释 extern可以置于变量或者函数前,以标示变量或者函数的定义在别的文件中,提示编译器遇到此变量和函数时在其他模块中寻找其定义. 另外,extern ...

  9. C++中extern “C”含义深层探索

    1.引言 C++语言的创建初衷是"a better C",但是这并不意味着C++中类似C语言的全局变量和函数所采用的编译和连接方式与C语言完全相同.作为一种欲与C兼容的语言,C++ ...

最新文章

  1. unix oracle控制台,Linux平台下启动oracle11gEM控制台
  2. 静态html使用js发送邮件,html实现邮箱发送邮件_js发送邮件至指定邮箱功能
  3. 5G — 3 大场景、8 大 KPI
  4. java的drawstring_java-Graphics.drawString()未绘制
  5. Wpf拖动按钮实现(二)
  6. mysql 主机类型_实现在别的电脑上访问主机的mysql
  7. 送给使用phpstorm+thinkphp开发者的福利
  8. OpenCV Laplace point/edge detection拉普拉斯点/边缘检测的实例(附完整代码)
  9. python编程游戏代码 游戏人物如何升级_如何玩游戏提高python编程技能?
  10. 栈 php 验证格式,表单验证 - 《Biny - 高性能轻量级PHP框架》 - 书栈网 · BookStack...
  11. webservice学习总结(一)-- WebService相关概念介绍
  12. oracle anonhugepage,案例:Oracle linux redhat检查Transparent HugePages状态并关闭
  13. 卷积神经网络及其特征图可视化
  14. gunicorn的用法
  15. iText的一些总结
  16. npm启动报错——端口被占用
  17. 自学系列-有哪些高质量的自学网站
  18. 同时分析多个中通快递单号物流的最后站点和派件员
  19. 12306的问题是技术难题吗
  20. OC 中 覆盖属性会有提示Auto property synthesis will not synthesize property 'delegate'

热门文章

  1. Shader-透明效果-透明度测试
  2. 淘宝便宜的那个奥比中光摄像头(astra pro)在ubuntu16.04下Ros(kinectic)中使用说明
  3. cookie/cookies
  4. 寄存器、RAM、ROM、Flash
  5. 数据结构C++——关键路径
  6. mfc实现加载jpg图片
  7. php保留一位小数_PHP小数点后保留几位的简单示例
  8. 如何在微信中打造一个社区?粉丝君说案例
  9. 关于研发中心技术开发部高级技术人员推荐的通知
  10. keil main.c(2): warning C318: can‘t open file ‘XXXX.h‘处理