程序猿c++(1) 为什么class可以在头文件中定义,而在链接时不会报重复定义的错误?

  • A+
所属分类:C++

程序猿c++(1) 为什么class可以在头文件中定义,而在链接时不会报重复定义的错误?

程序猿c++(1) 为什么class可以在头文件中定义,而在链接时不会报重复定义的错误?

程序猿c++(1) 为什么class可以在头文件中定义,而在链接时不会报重复定义的错误?

程序猿c++(1) 为什么class可以在头文件中定义,而在链接时不会报重复定义的错误?

以上代码可以正常运行!

我们可能会赶到奇怪,为什么class C在header中定义了,并且在其他两个cpp中都include了,结果,链接时不会报重复定义的错误?

 

原因:

编译单元:一个.cc或.cpp作为一个编译单元.生成.o,简单来说一个cpp文件就是一个编译单元。

类的声明:

class A;  //类的声明

类的声明和普通变量声明一样,不产生目标代码,可以在同一、以及多个编译单元重复声明。

类的定义:

class A {

……

};  //类的定义

类的定义不产生目标代码,只是告诉编译器,类的数据格式是如何的,实例化后对象该占多大空间,它和普通变量的声明唯一的区别是不能在同一编译单元内出现多次。同一编译单元内,类重复定义,会编译时报错,因为编译器不知道在该编译单元中,实例化对象的时候该调用哪一个定义的类?但是在不同编译单元内,类可以重复定义,因为类的定义未产生实际代码。因为它具有内部链接,(所谓内部链接指的是该名称对于所在编译单元是局部的,在链接时不会与其他编译单元中同样 的名称产生命名冲突),所以类定义在头文件中在链接时候不会冲突。

Qt大课堂-QtShare

发表评论

您必须登录才能发表评论!