extern的用法

1. 声明外部实体
声明外部全局变量或对象,一般用于头文件中,表示在其它编译单元内定义的变量,链接时进行外部链接,如: 
   
1. 声明外部实体
声明外部全局变量或对象,一般用于头文件中,表示在其它编译单元内定义的变量,链接时进行外部链接,如:  
extern int ivalue;  
此时的extern是必须的,省略了extern编译器将视为定义而不是声明,一般地在源代码中定义变量并进行初始化,在头文件中使用extern声明变量。

类似地用于声明外部全局函数,表示该函数在其它编译单元中定义,如:  
extern void func( void );  
此时的extern可以省略。

2. 声明函数的编译和链接方式
extern 后可以跟”C”或”C++”用于声明全局函数的编译和链接方式,例如:  
extern “C” void add( int a, int b);  
extern “C++” void sum(int* ia, int leng);  
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”中不能出现函数名重载,例如:  
extern “C”{  
int max(int a, int b);  
int max(float a, float b);  
}  
非法,编译器将报错。而C++标准中并没有定义extern “C”与extern “C++”的具体实现方式,不同编译器生成的符号规则可能不同。

需 要注意的是,如果函数声明使用了extern “C”,则函数定义必须使用C编译器编译,或者使用extern “C”来修改函数的编译方式,一般地将extern “C”声明的函数的定义所在的源程序扩展名使用.c即可,而C++代码放在.cpp文件中。如果将extern “C”声明的函数实现也放在.cpp中,则需要使用extern “C”来声明函数编译方式,例如:  
extern “C” {  
int max( int a, int b) { return a > b ? a : b; }  
}

只有在C++中使用C语言的库或者两种语言混合编程的时候才会用到extern “C”,而在C语言中是不支持extern “C”的,所以为了头文件通用,需要使用宏来控制,例如:  
#ifndef MAX_H // 防止重复引用  
#define MAX_H  
#ifdef __cplusplus  
extern "C" {  
#endif  
int max (int a, int b);  
#ifdef __cplusplus  
}  
#endif  
#endif  
其中__cplusplus为C++定义的宏,凡是C++的编译器都定义了该预编译宏,通过它来检测当前编译器是否使用的是C++编译器。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值