extern关键字的一般用法

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关键字的一些说明:

(1)extern声明外部函数

在A.cpp中使用B.cpp中的函数,需要extern声明。定义的形式类似于:

extern  int  a;

这里需要注意定义和声明的区别,extern
 int  a = 10;属于定义了。

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

extern int a = 10;
extern int b = 20;
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"这一句是单纯的代码替换,在Demo.cpp和main.cpp里替换之后你自然发现全局变量被定义了两次,肯定会报错。一句话,声明可以拷贝n次,但是定义只能定义一次

(2)extern声明全局变量

在A.cpp中使用B.cpp中的全局变量,需要extern声明。

extern关键字的作用是告诉编译器,在某个cpp文件中,存在这么一个函数/全局变量。

函数的声明类似于:

extern  int  sum(int, int);

函数的声明语句中,关键字extern可以省略,因为全局函数默认是extern类型的,因此也就出现了Demo.h中的状况。

虽然用extern声明了变量和函数之后,在别的文件里就随意使用了,但是你也千万别忘了书写变量和函数的实现,否则就会出现无定义,编译无法通过。

还有一件很有趣的事情,如果你将前面的Demo.cpp改为Demo.c的话,编译器会告诉你说找不到变量和函数的定义,怎么办呢?

我们将Demo.h里面的东西改一下写法即可:

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

#ifndef  _cplusplus
extern "C" {
#endif

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

#ifndef  _cplusplus
}
#endif

#endif
/*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");
}

说实话,结果我挺震惊的,在Demo.c文件中定义的函数跑出一个“这是一个c程序”,也没什么,在一个cpp文件中的函数跑出一个“这是一个c程序”,我就很震惊了,原因我也不清楚,不过基本就是上面的解决方案了,最后说一下不在Demo.c包含#include"Demo.h"的原因,因为在extern
“C”不是为C所支持,其实也不算吧!

因为网上说.c文件没有定义_cplusplus而cpp文件定义了_cplusplus,如果真是这样在Demo.c包含#include"Demo.h"也不会出现问题,可是不知道是我的编译器原因还是什么的,c文件和cpp文件都没定义_cplusplus,因此有可能Demo.c包含#include"Demo.h"出现问题,因为为了能在cpp文件中使用,Demo.h文件里我一般要写成#ifndef_cplusplus,此时若Demo.c包含#include"Demo.h",恰好c文件中也没有定义_cplusplus,那么extern
“C”就暴露出来了,自然会错。

ps:关于extern和extern “C”,有更好的讲解,我就不班门弄斧了。

http://pan.baidu.com/s/1hqnddWS

时间: 2025-01-04 10:04:47

extern关键字的一般用法的相关文章

C语言中extern关键字的用法

转载请注明出处http://blog.csdn.net/xingjiarong/article/details/47614171 利用关键字extern,可以在一个文件中引用另一个文件中定义的变量或者函数,下面就结合具体的实例,分类说明一下. 一.引用同一个文件中的变量 #include<stdio.h> int func(); int main() { func(); //1 printf("%d",num); //2 return 0; } int num = 3; i

extern关键字用法总结(顺带初始化和赋值的区别)

1.初始化和赋值的区别 初始化的含义是创建变量时赋予其一个初始值. 赋值是把对象的当前值擦除,用新值代替. 2.extern关键字的作用 C++的分离式编译机制可以让程序分为多个文件独立编译,如果要在多个文件中使用同一个变量,如果重复定义将发生程序错误,需要使用extern关键字来声明在另一个文件中已经定义过的变量.(如果为extern关键字声明的变量赋初值将抵消掉extern的作用,函数体内这样做将引发错误) 1 int a=0: //定义 2 3 extern int a: //声明 4 5

16-static和extern关键字2-对变量的作用

上一讲介绍了static和extern对函数的作用,static用来定义一个内部函数,不允许其他文件访问:extern用来定义和声明一个外部函数,允许其他文件访问.static和extern对变量也有作用,不过跟函数有点差别. C语言和Java都有全局变量的概念,但是它们的用法还是有些差别的. 一.在Java中,全局变量的定义没有严格的位置规定 全局变量可以定义在类的最前面,也可以定义在类的最尾端,也就说一个方法可以访问在它之后定义的变量. 可以看到,第4行定义的test方法可以访问第8行定义的

(转)extern关键字两种场景的使用

第一种场景 -- extern extern关键字的作用是声明变量和函数为外部链接,即该变量或函数名在其它文件中可见.用其声明的变量或函数应该在别的文件或同一文件的其它地方定义. 例如语句:extern int a;仅仅是一个变量的声明,其并不是在定义变量a,并未为a分配内存空间.变量a在所有模块中作为一种全局变量只能被定义一次,否则会出现连接错误.通常,在模块的头文件中对本模块提供给其它模块引用的函数和全局变量以关键字extern声明.例如,如果模块B欲引用该模块A中定义的全局变量和函数时只需

iOS 中 const static extern 关键字总结

在看一些高手所写的代码时,总是可以看到我们小白平常不用的关键字,一次,两次,三次,不能总是不明不白,现在总结一下日常开发中常用的关键字的作用: 关键字const/static/extern的释义和用法 1. const 这个单词翻译成中文就是 "常量"的意思.在程序中我们知道常量的值是不能变的,固定的.所以const关键字的作用就是: (1) const用来修饰右边的基本变量或指针变量 (2)被修饰的变量只读,不能被修改 下面举一个简单的例子: //声明一个int类型的变量a 初始化值

学习笔记之20-static和extern关键字2-对变量的作用

上一讲介绍了static和extern对函数的作用,static用来定义一个内部函数,不允许其他文件访问:extern用来定义和声明一个外部函数,允许其他文件访问.static和extern对变量也有作用,不过跟函数有点差别. C语言和Java都有全局变量的概念,但是它们的用法还是有些差别的. 一.在Java中,全局变量的定义没有严格的位置规定 全局变量可以定义在类的最前面,也可以定义在类的最尾端,也就说一个方法可以访问在它之后定义的变量. 可以看到,第4行定义的test方法可以访问第8行定义的

转载 浅谈C/C++中的static和extern关键字

浅谈C/C++中的static和extern关键字 2011-04-21 16:57 海子 博客园 字号:T | T static是C++中常用的修饰符,它被用来控制变量的存贮方式和可见性.extern "C"是使C++能够调用C写作的库文件的一个手段,如果要对编译器提示使用C的方式来处理函数的话,那么就要使用extern "C"来说明.本文主要介绍C/C++中的static和extern关键字. AD: static是C++中常用的修饰符,它被用来控制变量的存贮方

【C语言】20-static和extern关键字2-对变量的作用

本文目录 一.在Java中,全局变量的定义没有严格的位置规定 二.在C语言中,全局变量定义的位置是有限制的 三.重复定义同一个变量 四.不同源文件中的同名变量 五.static关键字 六.static和extern的总结 说明:这个C语言专题,是学习iOS开发的前奏.也为了让有面向对象语言开发经验的程序员,能够快速上手C语言.如果你还没有编程经验,或者对C语言.iOS开发不感兴趣,请忽略 上一讲介绍了static和extern对函数的作用,static用来定义一个内部函数,不允许其他文件访问:e

C语言 20-static和extern关键字2-对变量的作用

本文目录 一.在Java中,全局变量的定义没有严格的位置规定 二.在C语言中,全局变量定义的位置是有限制的 三.重复定义同一个变量 四.不同源文件中的同名变量 五.static关键字 六.static和extern的总结 说明:这个C语言专题,是学习iOS开发的前奏.也为了让有面向对象语言开发经验的程序员,能够快速上手C语言.如果你还没有编程经验,或者对C语言.iOS开发不感兴趣,请忽略. 上一讲介绍了static和extern对函数的作用,static用来定义一个内部函数,不允许其他文件访问: