现在的位置: 首页 > 综合 > 正文

C++中extern的使用

2013年08月03日 ⁄ 综合 ⁄ 共 1555字 ⁄ 字号 评论关闭

C++中extern的用法时间:2011-02-21 08:35:19来源:网络整理 作者:未知 点击:125次

来自:http://edu.codepub.com/2011/0221/29515.php
 
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++编译器。
 
本篇文章来源于:开发学院 http://edu.codepub.com   原文链接:http://edu.codepub.com/2011/0221/29515.php

抱歉!评论已关闭.