`
yidongkaifa
  • 浏览: 4062430 次
文章分类
社区版块
存档分类
最新评论

C++中extern的用法

 
阅读更多

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++编译器。

分享到:
评论

相关推荐

    C++ extern用法

    c++/cextern用法,不熟的朋友可以看一下

    extern用法详解

    extern用法详解 讲述 c\c++ extern关键字的用法…… 貌似非入门必备,但有备无患……

    C++中的extern “C”用法详解

    主要介绍了C++中的extern “C”用法详解,简单来说,extern “C”是C++声明或定义C语言符号的方法,是为了与C兼容,需要的朋友可以参考下

    C++中extern “C”的用法

    学习过C++的人都知道,extern关键字可以置于变量或者函数前,以标示变量或者函数的定义在别的文件中,提示编译器遇到此变量和函数时在其他模块中寻找其定义。这里起到的是声明作用范围的用处。另外,extern还可以与...

    C++简单代码示例说明extern用法

    用一个简单C++代码示例来说明extern用法;

    C/C++中extern "C" 的作用分析

    主要介绍了C/C++中extern "C" 的作用,是在进行C/C++程序设计中非常常见的用法,需要的朋友可以参考下

    C++中extern关键字使用

     方法一、全局函数和变量在devVar.c文件中实现,在extern.cpp文件中使用extern关键字声明在devVar.c文件中定义的函数和变量。  devVar.c文件的代码如下所示:  #include  int i = 1;  void func()  { ...

    探索C++的秘密之详解extern

    本文主要介绍了C+中extern的用法,希望对你的学习有所帮助。

    C++中extern "C"的用法

    主要介绍了C++中extern "C"的用法,是深入理解C++所应该掌握的概念,需要的朋友可以参考下

    浅谈C/C++中的static与extern关键字的使用详解

    本篇文章是对C/C++中的static与extern关键字的使用进行了详细的分析介绍,需要的朋友参考下

    C/C++中extern “C” 的作用分析

    我们经常会在C/C++程序中见到extern “C”,这是一个很重要的概念。本文就来以实例形式讲述C/C++中extern “C”的作用。分享给大家供大家参考之用。具体分析如下: 作用:实现C和C++混合编程。 原理:C和C++编译器...

    extern的使用 例子

    extern的用法,以及自己测试extern的几个程序

    extern c 用法解析

    C++语言的创建初衷是“a better C”,但是这并不意味着C++中类似C语言的全局变量和函数所采用的编译和连接方式与C语言完全相同。作为一种欲与C兼容的语言, C++保留了一部分过程式语言的特点(被世人称为“不彻底地...

    extern "C"的详细用法+demo

    详细介绍extern "C"的用法,有可运行的demo说明。可以深入掌握c与c++组合开发注意事项

    static,extern,全局变量的引用(c_c++)

    讲述了static,extern及全局变量的用法,通过实例讲解,上机运行通过,放心使用

    深入理解extern用法

    l声明extern关键字的全局变量和函数可以使得它们能够跨文件被访问。 我们一般把所有的全局变量和全局函数的实现都放在一个*.cpp文件里面,...l全局函数的声明语句中,关键字extern可以省略,因为全局函数默认是extern类

    const,extern,static,volatile的使用

    const,extern,static,volatile的使用

    C++ 中const总结

    C++ 中const总结 const 限定符把一个对象转换成一个常量,如 const int bufSize=512; 申 明 bufSize 的时候,如果不将它初始化,那么编译器会报错:const object must be initialized if not extern。因为 bufSize ...

Global site tag (gtag.js) - Google Analytics