.c 文件和 .h 文件的区别 以及 链接出错的问题(二)

来源:互联网 发布:淘宝快递代发 编辑:程序博客网 时间:2024/06/01 08:46

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;
}
};

多个cpp文件引用该h文件,不会出现问题。


/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

所以,这里要区别声明和定义的区别: int  a;实际上已经是定义了一个int型变量,而没有初始化;int a = 1,也是定义变量并且初始化;extern int  a;相当于只是声明;

       而对于自定义的数据类型,如结构体和类,声明就是写出他们的各种内部结构,如

struct TestStruct
{
int a;
int b;
double c;
void init()
{
a = 1;
};

};   而定义就是用该结构体定义一个该类型的变量,如 TestStruct   Ts;



     


原创粉丝点击