变量的声明与定义:

A definition of a variable allocates storage for thevariable and may also specify an initial value for the variable. There must be one and only one definition of a variable in aprogram.

A declaration makes known the type and name of the variableto the program. A definition is also a declaration:When we define a variable, we declare its name and type. We can declare a name without defining it by using theextern keyword. A declaration that is not also a definition consists ofthe object's name and its type preceded by the keyword extern.

函数的定义与声明很好区分,因为函数必须有函数体,编译器才给它分配空间。而变量仅需一个名字和类型,编译器即可分配空间给它。

声明只是告诉编译器某个变量和函数是存在的,但并没有真正分配空间。所以当后面的代码用到前面声明的变量或函数时,编译时不会报错,而链接时会报错。因为链接时编译器将寻找这些变量和函数的内存地址,如只声明未定义,链接器是找不到内存地址的,将报错。总之,定义将分配空间,所以定义只能有一次(多次定义则编译错误)。而声明不分配空间,故可声明多次。

extern关键字

extern可置于变量或者函数前,以标示变量或者函数的定义存在于其他文件中,提示编译器遇到此变量和函数时到其他模块(obj文件或库文件)寻找其定义。另外,extern也可用来进行链接指定。

并非所有的变量都能用extern声明,只有全局变量并且没有被static声明的变量才能声明为extern。如果不想自己源文件中全局的变量被其他文件引用,加上static声明即可。

示例:

声明且定义:

intfudgeFactor;

std::stringhello("Hello, world!");

void foo() {/*… */}

声明:

extern intfudgeFactor;

extern stringhello;

voidfoo();         // "extern" isoptional with function declarations

注意:使用extern关键字,要确保其声明的变量和函数一定要在某个cpp文件中定义。不要直接在h文件中定义,这样多次include后将产生多处定义。

参考:http://blog.csdn.net/zhenjing/archive/2009/07/11/4340306.aspx

[C++再学习系列] 变量的声明、定义与extern关键字相关推荐

  1. UNIX再学习 -- 环境变量

    之前讲gcc编译的时候,参看:C语言再学习 -- GCC编译过程 提到过静态库和共享库,那时只是简单的讲了下它们相关的编译链接,接下来就该详细介绍它们了.不过再讲解之前还需了解一下编程相关的环境变量. ...

  2. C++头文件保护符和变量的声明定义

    1.#ifndef #define #endif头文件保护符 在编译的过程中,每个.cpp文件被看成一个单独的文件来编译成单独的编译单元,#ifndef 保证类的头文件在同一个.cpp文件里被多次引用 ...

  3. [C++再学习系列] 具有链接的C++实体

    具有链接的实体,包括名字空间级的变量和函数,都是需要分配内存的.具有链接的实体如果在源文件(cpp)中出现多次,将意味着多次分配内存,每个内存空间定义一个特定的实体.这会导致:1) 空间膨胀:2) 出 ...

  4. [C++再学习系列] 引用和指针

    下面是网上关于引用和指针区别的常见答案: 引用和指针有如下三种区别: 1 引用必须在声明时初始化,而指针不用: 2 NULL不能引用,而指针可指向NULL: 3 引用一旦声明,引用的对象不能改变(但对 ...

  5. [C++再学习系列] 函数模板和类模板

    函数模板和类模板 C++ 提供类模板和函数模板.函数模板允许重载 ,而类模板不允许重载(类无重载概念).类模板可以进行全特化和偏特化,而函数模板仅能够全特化 .因此,写一个看似函数模板偏特化的函数模板 ...

  6. [C++再学习系列] 前置++与后置++

    前置++: type operator++(); 后置++: const type operator++(int ); 为了编译器区分前置和后置++,C++规定后缀形式有一个int类型参数,当函数被调 ...

  7. [C++再学习系列] 虚函数的4条规则

    对于常规的基类函数来说: 1 尽量使用非虚拟接口模式(NVI)让接口函数成为非虚拟的. 2 尽量让虚函数成为私用的. 3 只有当派生类需要调用基类对某个虚函数的实现时,才把虚函数声明为保护的. 4 基 ...

  8. C++ 笔记(05)— 变量(变量定义、声明、初始化、extern关键字、变量之间转换)

    1. 变量定义 变量定义就是告诉编译器在何处创建变量的存储,以及如何创建变量的存储.变量定义指定一个数据类型,并包含了该类型的一个或多个变量的列表,如下所示: type variable_list; ...

  9. 在c语言中函数的定义变量的值为,变量定义(C语言中变量的声明和定义)

    变量定义(C语言中变量的声明和定义),哪吒游戏网给大家带来详细的变量定义(C语言中变量的声明和定义)介绍,大家可以阅读一下,希望这篇变量定义(C语言中变量的声明和定义)可以给你带来参考价值. 3.函数 ...

最新文章

  1. [Head First设计模式]山西面馆中的设计模式——装饰者模式
  2. linux哪个命令不可以查看文件内容,linux命令--查看文件内容
  3. PCL安装与环境变量配置(Win10)
  4. php ldap 创建用户,PHP LDAP获取作为组成员的成员的用户详细信息
  5. JVM 调优实战--什么是垃圾回收及Java的自动垃圾回收GC
  6. Django框架深入了解_04(DRF之url控制、解析器、响应器、版本控制、分页)(二)
  7. [转]MySQL数据库优化总结
  8. English trip -- VC(情景课)2 D Reading
  9. 书店看不要钱的JS笔记
  10. 专访福建移动林志云: 5G使能,运营商全面进入数字化转型之路
  11. php单选框点击取消,取消选中单选框radio的三种方式
  12. LINQ查询表达式详解(2)——查询表达式的转换
  13. json数组转java集合
  14. 自己整理的Linux指令全集,附思维导图(适合刚入门的看),顺带命令大全网址方便查找指令
  15. 用ffmpeg批量转换WAV文件采样率
  16. 99行拓扑优化matlab程序解读,99行拓扑优化 代码解析
  17. “不限流量卡”真的不限量,但是却限制了这些!
  18. re.match的使用方法
  19. EasyRecovery15数据恢复软件相关使用教程
  20. 21天精通python电子版_小白21天精通Python是如何做到的?

热门文章

  1. 洛谷P1667/[10.22 模拟赛] 数列 (思维+模拟)
  2. selenium自动化测试浏览器驱动安装(属于转载文章)
  3. BZOJ 1503 treap
  4. 【原生js】js动态添加dom,如何绑定事件
  5. 【OGG】OGG的单向复制配置-支持DDL(二)
  6. HDU 4873 ZCC Loves Intersection(JAVA、大数、推公式)
  7. USACO1.4.2(The clocks)BFS
  8. 抓住二维核力的尾巴---将粒子
  9. 电子到底为什么会干涉?
  10. 密度泛函DFT与神经网络