1.头文件可以预先告诉编译器一些必要的声明,让编译器顺利进行下去,在连接实现以前.未必出现实际的定义.
头文件的意义在
a.使得程序简明,清晰.
b.避免了重复编写相同的声明代码.
2.**.c和**.h文件没有必然的联系., 在XX.h文件中声明变量,如int a;,即时在XX.c中include"XX.h", 直接赋值 a = 2;仍然会出错,需要使用 int a = 2.
3.在 .h文件中实现函数(不只是声明),则其他多个.c文件引用该.h文件时,会出现重定义错误;通过只在.h中声明可以解决。
5..c和.cpp的区别(在VS2010下)
在.h文件中只声明函数,在其他多个.c文件中引用该.h文件的时候,不会出现链接时redefine问题,同样在多个.c文件中引用该.h文件也不会出现重定义问题;
在.h文件中声明变量,如int a,其他多个 .c文件中引用该头文件,不会出现重定义问题; 如果在.h文件中只声明并且定义变量,如int a = 1,其他多个 .c文件中引用该头文件,会出现重定义问题(redefinition; multiple initialization);
在.h文件中只声明变量,如int a,其他多个 .cpp文件中引用该头文件,会出现重定义问题(redefinition; multiple initialization)或者链接出错(int A" (?A@@3HA) already defined in a.obj); 如果在.h文件中 使用 extern int a; 则不会出现问题。
如果在.h文件中,声明结构体struct或者类class,不会出现重定义或者链接问题;但是如果定义一个结构体或者类,则会出现重定义或者链接错误;
而在.c或者.cpp中则不会出现错误。
.h文件中:
class CA
{
int a;
public:
CA()
{
a = 1;
}
~CA();
void init()
{
a = 1;
}
};
/
所以,这里要区别声明和定义的区别: int a;实际上已经是定义了一个int型变量,而没有初始化;int a = 1,也是定义变量并且初始化;extern int a;相当于只是声明;
而对于自定义的数据类型,如结构体和类,声明就是写出他们的各种内部结构,如
struct TestStruct
{
int a;
int b;
double c;
void init()
{
a = 1;
};
}; 而定义就是用该结构体定义一个该类型的变量,如 TestStruct Ts;