变量的声明和定义以及extern的用法
                                        
变量的声明不同于变量的定义,这一点往往容易让人混淆。
l         变量的声明是告诉编译器,该变量名称已经存在,编译器认识这个名字,不会引起编译错误。
l         对变量进行定义之后,编译器就会给变量分配空间,链接时,链接器可以找到它们的地址。
在程序代码组织过程中,人们往往把变量的声明放在头文件中,而把变量的定义放在源文件中,如下面的例子所示(该例子在VC6.0中编译、链接通过):
file1.h
/////////////////////////////////////////////////////
// 文件名:file1.h
// 该文档用来测试extern的用法
// extern表示外部声明一个变量
// 声明一个变量就是告诉编译器,这个变量名已经存在
// 但是没有给它分配空间。也就是说,声明了一个变量
// 如果程序中引用了该变量,能够通过编译,但是,
// 如果没有在某个文件中定义该变量的话,则链接会出错
// 因为链接目标文件的时候,需要该变量的确切地址.
/////////////////////////////////////////////////////
 
#ifndef _FILE1_H
#define _FILE1_H
#include <iostream.h>
extern void FilePrint(int, int); //外部声明函数FilePrint
extern   m_nNum ;         //声明变量 m_nNum,常写成extern int m_nNum
 
#endif
 
file1.cpp
#include "file1.h"
 
int m_nNum = 1; //如果没有定义该变量,则main.cpp可以通过编译,但程序链接出错
void FilePrint(int a, int b)
{
 
       cout << "/n the num is " << a << "and the double is "
               << b <<endl;
       return;
}
 
main.cpp
#include "file1.h"
 
int main(int i, char b)
{
      
       cout << " the first parm is "<< i
               << " and the second char is " << b <<endl;
       FilePrint( m_nNum, 2*m_nNum);
       return 0;
}
 
在头文件中,声明了函数FilePrint和变量m_nNum,在file1.cpp中定义了这两个变量。如果没有在file1.cpp中定义这两个变量,那么,main.cpp可以通过编译,但是程序链接会出错。
变量的声明和定义往往不容易分清,很多时候声明的同时就定义了。如上例所示,如果没有在头文件file1.h中声明m_nNum,也没有在file1.cpp中定义,而是在main.cpp文件中声明全局变量:
int m_nNum;//声明的同时定义,编译器给该变量分配了空间
int main(int i, char b)
{
              m_nNum = 1;
              cout << " the first parm is "<< i
                      << " and the second char is " << b <<endl;
              FilePrint( m_nNum, 2*m_nNum);
              return 0;
}
函数的声明和定义比较容易区分。声明的时候不用写函数体,只需要确定函数名和参数就可以了;函数的定义需要函数体的实现。
如:void FilePrint(int, int) 告诉编译器函数FilePrint已经声明,它有两个int型的输入参数,在声明中,可以不写出形参的名称。
而 void FilePrint(int a, int b) { }表示函数已经定义,尽管它是一个空函数。
 
extern 关键字
extern 告诉编译器,该变量是在外部定义的,在本例中,当编译器对mail.cpp进行编译时,它告诉编译器,m_nNum和FilePrint是在其它文件 (file1.cpp)中定义的,链接的时候再到其它obj文件中寻找它们的地址。对于编译器来说,extern 告诉了它变量的名字。如在头文件file1.h中,只需要写成extern m_nNum 就可以了(当然也可以写成extern int m_nNum)。
另外要注意,并不是所有的变量都能够用extern 声明,只有全局非静态变量才能声明为extern。
如在file1.cpp中,static int m_nNum,编译会出错。

变量的声明和定义以及extern的用法的更多相关文章

  1. 【转】变量的声明和定义,从C到编译原理到C++,再到Java

    基础学了太久,时间一长有些东西就可能记得不太清楚,俗话说得好,"好记性不如烂笔头",所以把基础中的基础-变量的声明和定义,从C到编译原理到C++,再到Java用烂笔头记录下来 最早 ...

  2. JAVA学习笔记:注释、变量的声明和定义、

    本文内容: 注释 变量的声明和定义 成员变量和局部变量 首发时间:2018-03-16 15:59 注释: 单行注释:// 多行注释:/* - */ 变量: 变量是内存中的一个存储区域,变量的定义就是 ...

  3. 变量声明和定义及extern 转载

    在讨论全局变量之前我们先要明白几个基本的概念: 1. 编译单元(模块):    在IDE开发工具大行其道的今天,对于编译的一些概念很多人已经不再清楚了,很多程序员最怕的就是处理连接错误(LINK ER ...

  4. C++ 变量的声明与定义的区别

    变量声明和定义的区别 我们在程序设计中,时时刻刻都用到变量的定义和变量的声明,可有些时候我们对这个概念不是很清楚,知道它是怎么用,但却不知是怎么一会事,下面我就简单的把他们的区别介绍如下:(望我的指点 ...

  5. 【C++】C++中变量的声明与定义的区别

    声明(declaration):意味着告诉编译器关于变量名称.变量类型.变量大小.函数名称.结构名称.大小等等信息,并且在声明阶段不会给变量分配任何的内存. 定义(definition):定义就是在变 ...

  6. C++变量的声明和定义

    1.变量的定义:变量的定义用于为变量分配存储控件,还可以为变量指定初始值.在一个程序中,变量有且仅有一个定义. 2.变量的声明:用于向程序表名变量的类型和名字.程序中变量可以声明多次,但只能定义一次. ...

  7. C:变量的声明与定义

    声明变量不需要建立存储空间,如:extern int a; 定义变量需要建立存储空间,如:int b; #include <stdio.h> int main() { //extern 关 ...

  8. Java变量常量声明和定义

    一.常量和变量 1.常量变量定义 在程序中存在大量的数据来代表程序的状态,其中有些数据在程序的运行过程中值会发生改变,有些数据在程序运行过程中值不能发生改变,这些数据在程序中分别被叫做变量和常量. 2 ...

  9. C语言函数及变量的声明与定义的区别

    变量: 1.声明变量不需要建立存储空间,如:extern int a; 2.定义变量需要建立存储空间,如:int a:或者 int b=10:无论变量是否赋值,只要定义它,即占用空间. 3.int a ...

随机推荐

  1. 两个大数相乘-Java

    两个字符串表示两个非常大的数,请设计算法计算这两个大数的乘积,结果用字符串表示.例如S1="7832974972840919321747983209327",S2="19 ...

  2. if 分支语句

    写在<script></script>里面. if(判断条件){满足条件时要执行的语句} else{不满足条件时要执行的语句} 三元运算:var x = 判断条件?值1:值2: ...

  3. 关于wamp服务器文件的配置

    有的前端朋友想在手机端看PC端开发的html5页面,这时候会在本地PC下载一个wamp,这时候在PC端输入电脑的IP地址或者是直接输入localhost,可以访问www目录下的文件(开发项目必须放置在 ...

  4. 微信网页授权封装接口——node.js版

    Wechat 网页授权 授权url:(请在微信客户端中打开此链接体验) xxx为config.js中的WECHAT_DOMAIN 1.scope为snsapi_base xxx/?route=auth ...

  5. 将位图导入为ArcGIS面要素

    本文根据笔者经验,介绍一种从位图图像导入ArcGIS称为要素的方法.这种方法适用于从现有出版物图片中获取地理信息的情况. 首先要说明的是,从位图导入要素是非常非常不精确的方式,如果有其它数据来源,那么 ...

  6. JS中的函数和BOM

    文档注释:开头两个*.写在函数上方,在调用函数时, 可以看到文档中的描述信息:function aaa(){ } [函数的声明及调用] 1.函数的声明格式: function 函数名(参数1,参数2, ...

  7. The First Article

    由于公司项目比较紧张,开始自己的博客之旅推迟了好几个月.今天终于按捺不住,申请了博客. 心中竟然有一丝丝兴奋,终于可以和众多博友们讨论分享我们一路走来的收获和感悟,记录下我们在工作中遇到和解决的问题, ...

  8. vim插件ctags的安装与使用

    LINUX系统下看程序或者编程序时,看到一个函数经常需要知道该函数的定义,这时ctags就派上用场了,其安装和使用方法如下: 安装方法: sudo apt-get install ctags (ubu ...

  9. webpack配置这一篇就够

    最近看了一篇好文,根据这个文章重新梳理了一遍webpack打包过程,以前的一些问题也都清楚了,在这里分享一下,同时自己也做了一些小的调整 原文链接:http://www.jianshu.com/p/4 ...

  10. 转:【Java并发编程】之二十二:并发新特性—障碍器CyclicBarrier(含代码)

    转载请注明出处:http://blog.csdn.net/ns_code/article/details/17512983 CyclicBarrier(又叫障碍器)同样是Java5中加入的新特性,使用 ...