[C/C++] extern关键字详解以及与static、const区别 |
您所在的位置:网站首页 › c51与标准c的异同点 › [C/C++] extern关键字详解以及与static、const区别 |
extern用法详解: 1. 声明外部实体声明外部全局变量或对象,一般用于头文件中,表示在其它编译单元内定义的变量,链接时进行外部链接,如: extern int ivalue; 此时的extern是必须的,省略了extern编译器将视为定义而不是声明,一般地在源代码中定义变量并进行初始化,在头文件中使用extern声明变量。 类似地用于声明外部全局函数,表示该函数在其它编译单元中定义,如: extern void func( void ); 此时的extern可以省略。 2. 声明函数的编译和链接方式extern 后可以跟"C"或"C++"用于声明全局函数的编译和链接方式,例如: 1 extern "C" void add( int a, int b); 2 extern "C++" void sum(int* ia, int leng); 3 void sum(int* ia, int leng);其中的extern "C++"可以省略,它是在C++中默认的链接方式,即后面两种声明方式是等效的。这种声明有两种含义:首先,声明这些函数使用外部链接方式,其实现不在本编译单元之内;另一种含义,则是告诉编译器编译方式,如extern "C"则是告诉编译器使用C语言的编译方式编译该函数。 C++支持函数重载,所以参数不同在编译后生成的函数名也不同,如: int max(int a, int b); int max(float a, float b); 在编译时生成的函数名可能分别为_max_int_int、_max_float_float,通过在函数名后加上参数类型来区分不同的函数,如果使用C语言方式,则生成的函数名中不包含参数信息,只生成_max,所以无法实现重载,也就是说在extern “C”中不能出现函数名重载,例如: 1 extern "C" { 2 int max(int a, int b); 3 int max(float a, float b); 4 }非法,编译器将报错。而C++标准中并没有定义extern “C”与extern “C++”的具体实现方式,不同编译器生成的符号规则可能不同。 需要注意的是,如果函数声明使用了extern "C",则函数定义必须使用C编译器编译,或者使用extern "C"来修改函数的编译方式,一般地将extern "C"声明的函数的定义所在的源程序扩展名使用.c即可,而C++代码放在.cpp文件中。如果将extern "C"声明的函数实现也放在.cpp中,则需要使用extern "C"来声明函数编译方式,例如: 1 extern "C" { 2 int max( int a, int b) 3 { 4 return a > b ? a : b; 5 } 6 }只有在C++中使用C语言的库或者两种语言混合编程的时候才会用到extern "C",而在C语言中是不支持extern "C"的,所以为了头文件通用,需要使用宏来控制,例如: 1 #ifndef MAX_H // 防止重复引用 2 #define MAX_H 3 #ifdef __cplusplus 4 extern "C" { 5 #endif 6 int max (int a, int b); 7 #ifdef __cplusplus 8 } 9 #endif 10 #endif其中__cplusplus为C++定义的宏,凡是C++的编译器都定义了该预编译宏,通过它来检测当前编译器是否使用的是C++编译器。 extern和static比较: (1)extren表明该变量在别的地方已经定义过,而在这里要使用那个变量。 (2)static表示静态的变量,分配内存时,存储在静态区,不存储在栈上面。 static 作用范围是内部连接的关系, 和extern有点相反.它和对象本身是分开存储的,extern也是分开存储的,但是extern可以被其他的对象用extern 引用,而static 不可以,只允许对象本身用它。 具体差别:首先,static与extern是一对“水火不容”的家伙,也就是说extern和static不能同时修饰一个变量;其次,static修饰的全局变量声明与定义同时进行,也就是说当你在头文件中使用static声明了全局变量后,它也同时被定义了;最后,static修饰全局变量的作用域只能是本身的编译单元,也就是说它的“全局”只对本编译单元有效,其他编译单元则看不到它,如: (1)test.h: 1 #ifndef TEST1H 2 #define TEST1H 3 static char g_str[] = "123456"; 4 void fun1(); 5 #endif(2)test1.cpp: 1 #include "test.h" 2 void fun1() 3 { 4 cout |
今日新闻 |
点击排行 |
|
推荐新闻 |
图片新闻 |
|
专题文章 |
CopyRight 2018-2019 实验室设备网 版权所有 win10的实时保护怎么永久关闭 |