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

原创 2013年12月02日 01:20:22

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;



     


C++头文件重定义解决方式

C++由于头文件重复包含了所定义的变量或者常量,编译器就会报重复定义的错误。 可以通过以下几种方式进行解决: 1、在头文件加上防止重定义的宏: #ifndef FileName_H_ #def...
  • xmnathan
  • xmnathan
  • 2015年12月27日 21:52
  • 1035

struct 结构体“重定义;不同的基类型”

今天遇到这么一个问题,一个结构体编译报错,“重定义;不同的基类型”,这个结构体在一个头文件中定义,在两个cpp文件中包含该头文件,就报这个错误,结构体的定义形式为: typedefine struct...
  • shenshen211
  • shenshen211
  • 2016年09月21日 18:43
  • 3412

C++ 头文件中重定义

C++ 头文件中重定义
  • Loversing
  • Loversing
  • 2017年01月07日 00:15
  • 227

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

关于两者以前的关系,要从N年以前说起了~ long long ago,once aupon a time ....... 那是一个被遗忘的年代,在编译器只认识.c(.cpp))文件,而不知道.h是何物...
  • skc361
  • skc361
  • 2013年12月01日 23:48
  • 924

.h, lib和dll文件的功能和区别

简而言之 (1).h是头文件,lib和dll都是库文件。 (2)头文件包含声明,库文件则包含实现。 (3)lib是静态链接时使用的,如果采用静态链接库,则lib包含了实际执行代码和符号表等,无论...
  • chenwk891
  • chenwk891
  • 2013年10月25日 11:44
  • 1473

关于头文件重复包含以及函数重定义问题

转载:http://blog.chinaunix.net/uid-23634108-id-2393493.html 调试的问题出现这个问题还蛮奇怪的,a.h需包含statistic.h, m...
  • lyh__521
  • lyh__521
  • 2015年08月06日 00:09
  • 1198

在头文件中用宏定义来避免重复包含,仍然会出现函数重定义的错误

本博客转载于:http://blog.csdn.net/kkforwork/article/details/42679041 1. 在头文件包含中用了宏定义,还是会出现函数重定义的错...
  • Explorer_day
  • Explorer_day
  • 2017年02月17日 11:29
  • 814

C/C++ 语言中.h文件和.c文件详细解析 引用 .c和.h文件的区别

预处理是编译器的前驱,作用是把存储在不同文件里的程序模块集成为一个完整的源程序. #include本身只是一个简单的文件包含预处理命令,即为把include的后面文件放到这条命令这里,除此之外,没有其...
  • qq_17242957
  • qq_17242957
  • 2015年12月22日 22:08
  • 3951

DSP .c 和.h文件架构

test.c文件构架 1、包含本文件对应头文件test.h 2、定义仅供本文件内部使用全局变量:用static修饰 3、定义可供外部文件使用的全局变量 4、引用外部文件定义的全局变量的申明:加exte...
  • u010264931
  • u010264931
  • 2015年10月12日 13:32
  • 831

避免头文件的重定义

假设源文件test.c中包含a.h和b.h两个头文件,而a.h和b.h里又都包含另一个头文件x.h(很常见),那么x.h就会被test.c两次include,如果x.h里定义了某结构体,如: t...
  • zhangcz0106
  • zhangcz0106
  • 2014年10月31日 11:15
  • 417
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:.c 文件和 .h 文件的区别 以及 链接出错的问题(二)
举报原因:
原因补充:

(最多只允许输入30个字)