extern关键字

8人阅读 评论(0) 收藏 举报
分类:

extern关键字会提升变量或者函数的逼格,使得它们可以跨文件被访问。
首先,你得在cpp文件里面实现这些全局变量和全局函数,这是最基本的,然后只需要在需要用到这些变量和函数的文件里声明一下,用extern修饰声明,这样弄完之后就可以随意使用这些全局变量和全局函数了。
别的文件里写一堆的extern声明显得特别不专业,也显得代码十分臃肿,有没有好的做法呢?
我们一般把所有的全局变量和全局函数都放在一个.cpp文件里面然后用一个同名的**.h文件包含所有的函数和变量的声明。用法的示例如下:

/*Demo.h*/  
#ifndef _DEMO_H_  
#define _DEMO_H_  

extern int a;  
extern int b;  
int add(int a, int b);  

#endif  
/** 
//下面的写法也可以 
#pragma  once 
extern int a; //这是定义了啊 
extern int b; 
*/  
/*Demo.cpp*/  
#include "Demo.h"   
int a = 10;  
int b = 20;  

 int add(int l, int r)  
{  
    return l + r;  
}  
/*main.cpp*/  
#include "Demo.h"  
#include <iostream>  
using namespace std;  

void main()  
{  
    cout << "a = " << a << ", b = " << b << endl;  

    int c = add(1, 2);  
    printf("c = 1 + 2 = %d \n", c);  
    system("pause");  
}  

这样处理之后只需要到用到的地方加入#include”Demo.h”一句即可,这么干方便了这些变量和全局函数的管理。
注意定义和声明的区别,extern int a = 10;属于定义了。如果在.h文件里这样写肯定是编译不通过的,因为存在重定义。#include”Demo.h”这一句是单纯的代码替换,在Demo.cpp和main.cpp里替换之后你自然发现全局变量被定义了两次,肯定会报错。一句话,声明可以拷贝n次,但是定义只能定义一次
在A.cpp中使用B.cpp中的全局变量,需要extern声明。extern关键字的作用是告诉编译器,在某个cpp文件中,存在这么一个函数/全局变量。函数的声明类似于:extern int sum(int, int);函数的声明语句中,关键字extern可以省略,因为全局函数默认是extern类型的。

  • 如果你将前面的Demo.cpp改为Demo.c的话,编译器会告诉你说找不到变量和函数是无法解析的外部符号,怎么办呢?

之所以会出现这样的原因,是因为c++编译器和c编译器差异性的问题,C++语言在编译的时候为了解决函数的多态问题,会将函数名和参数联合起来生成一个中间的函数名称,而C语言则不会,因此会造成链接时找不到对应函数的情况,我们是在main.cpp文件里包含了Demo.h也就是在main.cpp里面声明了这么一些变量和函数(代入即可),main.cpp里面的声明会被c++编译器成处理中间的名称,而Demo.c里面的实现会被c编译器处理,两者处理的差异性,导致问题多多。总之处理之后.c文件的实现和.cpp里面的声明不一致了,这也是导致找不到的原因,这个时候就必须用extren “C”了,告诉c++编译器,请保持我的名称,不要给我生成用于链接的中间函数名。
声明

/*Demo.h*/  
#ifndef _DEMO_H_  
#define _DEMO_H_  

#ifdef  __cplusplus  
extern "C" {  
#endif  

    extern int a;  
    extern int b;  
    int add(int a, int b);  


#ifdef  __cplusplus  
}  
#endif  

定义
注意:**__cplusplus,前面是两个_

/*Demo.c*/  
//#include "Demo.h"  
#include <stdio.h>  
int a = 10;  
int b = 20;  

 int add(int l, int r)  
{  
#ifndef __cplusplus  
    printf("这是一个c程序!\n");  
#endif // !_cplusplus  

#ifdef __cplusplus  
    printf("这是一个c++程序!\n");  
#endif // !_cplusplus  
    return l + r;  
}  

使用

/*main.cpp*/  
#include "Demo.h"  
#include <iostream>  
using namespace std;  

void main()  
{  
#ifdef __cplusplus  
    cout << "这是一个c++程序" << endl;  
#endif  

#ifndef __cplusplus  
    cout << "这是一个c程序" << endl;  
#endif  
    cout << "a = " << a << ", b = " << b << endl;  

    int c = add(1, 2);  
    printf("c = 1 + 2 = %d \n", c);  
    system("pause");  
}  
查看评论

Create Your Own Visual Basic Add-Ins

Create Your Own Visual Basic Add-InsBy S.S. AhmedRating: 3.7 out of 5Rate this article docume...
  • sonicdater
  • sonicdater
  • 2002-03-09 18:00:00
  • 923

extern 关键字的作用

** extern的作用**demo.h 头文件#ifndef _DEMO_H #define _DEMO_H#ifdef __cplusplus extern "C"{ #en...
  • chenhittler
  • chenhittler
  • 2015-10-09 10:50:26
  • 1249

extern关键字的一般用法

extern关键字会提升变量或者函数的逼格,使得它们可以跨文件被访问。话虽然是这么说,使用这个关键字必须要注意一些东西。 首先,你得在cpp文件里面实现这些全局变量和全局函数,这是最基本的,然后只需要...
  • lishuhuakai
  • lishuhuakai
  • 2015-05-24 03:02:04
  • 9668

C语言中关键字extern的作用

 1 基本解释   extern可以置于变量或者函数前,以标示变量或者函数的定义在别的文件中,提示编译器遇到此变量和函数时在其他模块中寻找其定义。   另外,extern也可用来进行链接指定。2 问题...
  • xiaozhi_su
  • xiaozhi_su
  • 2009-05-09 13:56:00
  • 13344

extern 关键字 声明和定义的区别

extern实际上就两种用法,就是后面加不加C 一,后面加C如: extern "C" void fun(int a, int b);就是告诉编译器在编译fun这个函数名时按着C的规则去翻译相应的函数...
  • u011676589
  • u011676589
  • 2013-08-17 16:40:03
  • 2188

详解 C/C++中 extern 关键字

1 定义:     extern可以置于变量或者函数前,以标示变量或者函数的定义在别的文件中,提示编译器遇到此变量和函数时在其他模块中寻找其定义。 问题1 :     e...
  • qq_26626709
  • qq_26626709
  • 2016-08-15 10:18:22
  • 240

C++中extern关键字

1. 序言extern是一个关键字,它告诉编译器程序中存在着一个变量或者一个函数,如果在当前编译语句的前面中没有找到相应的变量或者函数,也会在当前文件的后面或者其它文件中定义。因此,extern的功能...
  • wutong_xingkong
  • wutong_xingkong
  • 2016-01-20 19:09:22
  • 2546

C语言正确使用extern关键字

转载请注明出处利用关键字extern,可以在一个文件中引用另一个文件中定义的变量或者函数,下面就结合具体的实例,分类说明一下。 一、引用同一个文件中的变量#includeint func();int...
  • xingjiarong
  • xingjiarong
  • 2015-08-14 08:37:33
  • 32168

变量的声明和定义的关系、extern关键字的使用

变量声明规定了变量的名字和类型,定义还申请存储空间,也可能会为变量赋一初值。 注意: 变量可以声明很多次,但定义只能定义一次,否则编译器将会报错。 在编写复杂程序时,会有许多文件,需要有...
  • xiaoyuxianshenging
  • xiaoyuxianshenging
  • 2017-02-10 10:28:33
  • 1091

linux extern关键字的作用

1.简单的例子。        //包含头文件是为了声明这个函数,表示这个函数已经被定义过了,已经生产过二进制代码了。 File.c代码   #include ...
  • chengfangang
  • chengfangang
  • 2013-06-30 12:38:34
  • 1416
    个人资料
    等级:
    访问量: 928
    积分: 98
    排名: 125万+
    文章分类