c/c++ 中 extern 用法

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中不支持!!


  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值