extern关键词的作用

extern关键词有两个用途:

1. extern "C“ 表示修饰的函数是在C中定义的,告诉编译器编译时按照C的规则来编译。这是由于C++为了实现函数的重载,在编译时会将函数翻译为函数名加参数的形式,例如void foo( int x, int y );会被翻译成类似_foo_int_int的样子,不同的编译器格式不同,但原理类似。那么在C++中调用C的函数时,会找不到C中的函数,因为在C中该函数被翻译成了_foo之类的形式。为了能够在C++中兼容C,所以在include头文件时,需要加上extern "C"。

2.extern修饰变量或者函数,用来声明全局变量,该变量可能在声明的文件中之后的地方定义,也可能在其他文件中定义。要想搞明白这个,需要首先弄清楚声明和定义的区别。

首先看一下声明和定义的区别:

①变量定义:用于为变量分配存储空间,还可为变量指定初始值。程序中,变量有且仅有一个定义。

②变量声明:用于向程序表明变量的类型和名字。

③定义也是声明:当定义变量时我们声明了它的类型和名字。

比如下面的例子:

 1 int i;       //声明一个变量i
 2 i = 0;       //定义变量i
 3 int b = 0;   //声明并且定义变量b
 4
 5 int add(int a, int b);      //声明一个函数add
 6
 7 int add(int a, int b)       //定义函数add
 8 {
 9     return a + b;
10 }

清楚了声明和定义的区别之后,就来看extern的具体用法。

1.在当前文件中声明全局变量

 1 #include "stdafx.h"
 2 #include<iostream>
 3 using namespace std;
 4
 5 int _tmain(int argc, _TCHAR* argv[])
 6 {
 7     extern void func();    //声明全局函数func
 8     func();
 9
10     extern int i;         //声明全局变量i
11     cout << i;
12     return 0;
13
14 }
15
16 int i = 5;
17 void func()
18 {
19     cout << "func called!\n";
20 }

2.在其他文件中声明全局变量,这种情况用于A.cpp要使用B.cpp中的全局变量,那么可以在B.h中声明全局变量,在B.cpp中定义全局变量,这样A将B的头文件引入后,就可以使用了

1 //B.h
2
3 extern int i;
1 //B.cpp
2
3 #include "B.h"
4 int i = 5;
 1 // A.cpp : 定义控制台应用程序的入口点。
 2 //
 3
 4 #include "stdafx.h"
 5 #include<iostream>
 6 #include"B.h"
 7 using namespace std;
 8
 9 int _tmain(int argc, _TCHAR* argv[])
10 {
11     cout << i;
12     return 0;
13 }

3. static修饰全局变量

static修饰全局变量与extern恰好相反,static修饰的全局变量只能被当前文件使用,而无法在其他文件中使用

时间: 2024-10-14 05:59:11

extern关键词的作用的相关文章

C++编译时函数名修饰约定规则(很具体),MFC提供的宏,extern &quot;C&quot;的作用

调用约定: __cdecl __fastcall与 __stdcall,三者都是调用约定(Calling convention),它决定以下内容:1)函数参数的压栈顺序,2)由调用者还是被调用者把参数弹出栈,3)以及产生函数修饰名的方法. 1.__stdcall调用约定:函数的参数自右向左通过栈传递,被调用的函数在返回前清理传送参数的内存栈, 2._cdecl是C和C++程序的缺省调用方式.每一个调用它的函数都包含清空堆栈的代码,所以产生的可执行文件大小会比调用_stdcall函数的大.函数采用

extern “C”的作用详解

extern "C"的主要作用就是为了能够正确实现C++代码调用其他C语言代码.加上extern "C"后,会指示编译器这部分代码按C语言的进行编译,而不是C++的.由于C++支持函数重载,因此编译器编译函数的过程中会将函数的参数类型也加到编译后的代码中,而不仅仅是函数名:而C语言并不支持函数重载,因此编译C语言代码的函数时不会带上函数的参数类型,一般之包括函数名. 这个功能十分有用处,因为在C++出现以前,很多代码都是C语言写的,而且很底层的库也是C语言写的,为了

java基础(五)之static关键词的作用

static关键词的作用 1.静态成员变量的语法特定2.静态函数的语法特定3.静态代码块的语法特定 定义静态成员变量 Person.java class Person{ static int a; } 按照以前可以这么调用 public class Test1{ public static void main(String[] args){ Person person = new Person(); person.a = 10; System.out.println(person.a); } }

第2例——extern关键字的作用

1 基本解释:extern可以置于变量或者函数前,以标示变量或者函数的定义在别的文件中,提示编译器遇到此变量和函数时在其他模块中寻找其定义.此外extern也可用来进行链接指定. 也就是说extern有两个作用,第一个,当它与"C"一起连用时,如: extern "C" void fun(int a, int b);则告诉编译器在编译fun这个函数名时按着C的规则去翻译相应的函数名而不是C++的,C++的规则在翻译这个函数名时会把fun这个名字变得面目全非,可能是[

extern “C”的作用

1.引言 C++语言的创建初衷是“a better C”,但是这并不意味着C++中类似C语言的全局变量和函数所采用的编译和连接方式与C语言完全相同.作为一种欲与C兼容的语言,C++保留了一部分过程 式语言的特点(被世人称为“不彻底地面向对象”),因而它可以定义不属于任何类的全局变量和函数.但是,C++毕竟是一种面向对象的程序设计语言,为了支 持函数的重载,C++对全局函数的处理方式与C有明显的不同. 2.从标准头文件说起 某企业曾经给出如下的一道面试题: 面试题 为什么标准头文件都有类似以下的结

extern C的作用具体解释

转载于:http://www.cnblogs.com/rollenholt/archive/2012/03/20/2409046.html 1.引言 C++语言的创建初衷是"a better C".可是这并不意味着C++中类似C语言的全局变量和函数所採用的编译和连接方式与C语言全然同样.作为一种欲与C兼容的语言. C++保留了一部分过程式语言的特点(被世人称为"不彻底地面向对象").因而它能够定义不属于不论什么类的全局变量和函数. 可是,C++毕竟是一种面向对象的程

extern &quot;c&quot;的作用详解

extern "c"的主要作用就是为了能够正确实现C++代码调用其它C语言代码.加上extern "c"后,会指示编译器这部分代码按照C语言的风格进行编译.         由于C++支持函数重载,因此编译器编译函数的过程中会将函数的参数类型也加到编译后的代码中,而不仅仅是函数名:C语言并不支持函数重载,因此编译C代码的函数时不会带上函数的参数类型,一般只包括函数名. 这个功能十分有用,因为在C++出现以前,很多代码都是C语言写的,而且底层的库也是C语言写的,为了更

const define static extern 关键词详解

const const关键词并不能把一个变量变成一个常量, 在符号前加上const表示这个符号不能被赋值, 即他的值对这个符号来说是只读的, 但并不代表这个值不能用其他方法去改变. 通过下面的例子就能比较好理解, int i = 5;const int *a = &i;*a = 8;   //报错, 只读不能赋值i = 10;   //ok 平常我们见得多的const用法有如下几种,似乎可以总结为“就近原则”:即const最靠近其右边哪个变量,就说明那个变量为常量.” const int *p1

extern &quot;c&quot; 的作用

作用:实现C和C++混合编程. 原理:C和C++编译器编译之后,函数名会编译成不同的名字,链接阶段名字查找会找不到目标,后面实例中会详解. 用法:①.c文件中定义的函数,.cpp文件要调用时,该.cpp文件中要用extern "C"声明该函数:②反过来,.cpp文件中定义的函数,.c文件要调用,则同样要在.cpp文件中用extern "C"声明,.c文件只用普通的extern声明. 两个源文件分别编译成.o文件,再链接成执行文件.链接.o文件生成执行文件时,必须得用