定义与声明是C/C++基本的概念,看似很简单的东西,但区分不好往往很容易出错。C/C++中规定,使用一个对象(非面向对象中的对象,此处对象指广泛意义上的程序元素,下同)前必须先定义该对象。所谓定义,是指在程序中描述一个对象实体;声明是指将一个名称引入一个程序。大多数情况下可以不加区分的使用它们,因为这时候定义就是声明。
当涉及到头文件与源文件时,情况就变得有些复杂了。类比于对象的声明与定义,C/C++中头文件可认为是声明,而源文件用于定义,形式上有点类似于Java的接口和实现类。作为类库提供给第三方使用时,只需提供头文件和实现的Dll即可,达到了信息隐藏效果。由于头文件不能单独编译,即不能通过编译头文件产生符号表,因此在头文件中描述某种实现的过程是非法的。
先来看看那些情况只是声明而非定义:
1. 包含extern定义符的变量和函数;
2. 没有提供实现的函数(没有函数体);
3. 类中的静态数据成员;
4. teypedef声明;
关于声明和定义还有个区别就是在一个作用域中可以重复声明,但不能重复定义。
还是看例子吧,比较容易说明问题,在头文件(head.h)中:
- #ifndef H1_H
- #define H1_H
- typedef char* NAME;
- typedef char* NAME; //重复声明,没问题
- extern int k;
- //int ilk1; 此处为定义,非法。注,此句在VC6中是合法的,可能是VC2005现实C99标准
- //extern int ilk2 = 4; 非法,
- extern void outPut();//声明,合法
- void outPut2(); //声明,合法
- //void ilOutPut(){} 定义,非法
- inline void put(){}//内敛,合法
- static int i;
- //static int ili2 = 4; 非法
- class Radio{
- public:
- static int s_count;
- void ilfoo();
- /*void ilfoo();重复声明,非法。 注意,类中的声明不能重复,这是声明能重复的特殊情况*/
- private:
- int size() const;
- char getchar() //合法
- {
- return 'c';
- }
- };
- inline int Radio::size() const
- {
- return s_count;
- }
- extern Radio *ra;//合法,声明
- //Radio ra; 非法, 可此句放到包含该头文件的源文件中
- //void Radio::ilfoo(){}; 非法, 可此句放到包含该头文件的源文件中
- //int Radio::s_count = 5; 非法, 可此句放到包含该头文件的源文件中
- #endif