Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1093304
  • 博文数量: 242
  • 博客积分: 10209
  • 博客等级: 上将
  • 技术积分: 3028
  • 用 户 组: 普通用户
  • 注册时间: 2008-03-12 09:27
文章分类

全部博文(242)

文章存档

2014年(1)

2013年(1)

2010年(51)

2009年(65)

2008年(124)

我的朋友

分类: C/C++

2008-10-31 10:35:33

  有一部分C++程序员对于多个源文件一起编译链接时,变量,函数或者类声明和实现到底如何定义模糊不清,现在分类澄清一下。
  
变量 (variable)
 
      在C++中,变量声明只有在使用extern关键字时才成立,其他情况下都是定义,而在使用 extern的同时给变量赋初始值,则声明变为定义,extern关键字也将被编译器忽略。C++变量的作用域缺省情况下是全局的,也就是对多个源文件可见,比如说,如果在a.cpp和b.cpp中都有
    int a;
则编译器链接两个文件时会报告错误,“变量重复定义”。因此,要使变量定义只对该源文件可见,就要显式加上static关键字。因此,我们可以想到,如果在a.cpp中有
    extern int a;
而在b.cpp中有
    static int a = 9;
那么,编译器链接时会给出错误信息,“找不到a的定义”,因为a的定义在b.cpp并只对该文件可见,a.cpp找不到a的定义因此出错。
 
      变量的声明和定义是比较容易混淆的概念,因此记住一点,除非有extern关键字,否则都是变量的定义。由此,我们可以归纳出几点好的程序设计风格:
      1. 不要把变量定义放入.h文件,这样容易导致重复定义错误。
      2. 尽量使用static关键字把变量定义限制于该源文件作用域内,除非该变量被设计成全局的。
例外情况是const变量和typedef类型,在《The C++ Programming Language》9.2节中说到,const和typedef缺省作用域是局部的,因此不需要static来显式声明。因此,在.h文件中放置 const变量定义不会产生问题,编译器会给每个引用该.h文件的源文件产生一份该const变量的局部定义,就像该变量是定义于该源文件中一样。大家也 不用太担心编译器这么做会浪费空间,因为编译器优化过程一般会把有相同值的const变量进行合并。
 
      对于static关键字,要多说几句的是,static一般有两种意思,当修饰函数定义里的变量或者类成员变量时,称作静态变量;修饰其他变量时,称作局部变量。为防止混淆,一般不要特意给局部变量加上static关键字。除了static关键字,namespace也可以使变量定义成为局部的。
 
函数 (function)
 
      C++函数的声明和定义比较容易区分,定义必须有花括号,否则就是声明。函数的作用域和变量一样缺省是全局的,因此如果要限制其作用域于该源文件,则要加 上static关键字。由于函数声明和定义对编译器来说很容易区分,因此声明前的extern关键字不是必需的。函数声明本来也是需要一个“extern”的,比如:闪吧新社区 H sw mq%p.i

_N;UlC[1L0extern void CalcTotal(int n);闪吧新社区?:Jm;O:P`E

闪吧新社区/D1N`X$z

你在代码里这样完全正确!只不过由于函数声明和函数定义的格式区别很大,(声明没有函数体,定义则必须有函数体),所以这个extern就算不写,也可以让编译器认出来它是一个“声明”。结果就规定可以不写"extern"了。

阅读(1516) | 评论(0) | 转发(1) |
给主人留下些什么吧!~~