繁体   English   中英

.h(头文件)和.cpp文件有什么区别?

[英]What is the difference between a .h(header file) and a .cpp file?

我正在创建一个窗口:表单应用程序。 我已经阅读了一些答案,试图理解.h(头文件)和.cpp(实现文件)的概念。 当我为我的应用程序创建GUI时。 我注意到代码放在.h文件中。 但是,当我双击按钮控件以向过程添加代码时,代码是在.h文件而不是.cpp文件中创建的。 我是否将此代码剪切并放入.cpp文件中,或者这是链接进来的地方? 过程deffintion保留在.h文件中,并将链接到.cpp文件中的过程代码。

正如其他人所说,头文件用于类,函数,类型等声明,而.cpp文件应该包含函数的实现。 但是,编译器并不关心编写实现代码的位置,因此您可以将所有代码放在标头本身中。 但这样做会增加编译时间,因为所有代码都将编译在包含该头文件的每个文件中。

如果要分发代码但需要隐藏专有代码,那么保持实现分离非常有用。 在这种情况下,您可以从实现代码创建库,并将标头与库一起分发。

例外情况是编写模板代码时; 在这种情况下,实现必须进入头部,因为编译器需要在调用点“看到”它。

这里有两个考虑因素。 首先,头文件在托管代码中并不像在本机C或C ++中那么重要。 托管代码编译器从程序集元数据中读取声明,您不会(也不应该)编写需要在头文件中的其他模块中可见的C ++ / CLI类型声明。 从元数据中获取它们使您的类型可用于任何 .NET语言。

但真正的原因是因为表单设计器在C ++ IDE中的工作方式。 它是一个代码生成器,由您在表单或用户控件上放置的控件以及在“属性”窗口中设置的属性驱动。 如果代码生成器需要在两个单独的文件中生成代码,则存在一个非常棘手的问题。 不是生成位,而是在更改表单设计时删除代码。 使文件不同步会导致难以从自动生成的代码中诊断编译错误。 它比你想象的更有可能发生,代码生成器需要处理正在编辑的源代码文件。 非常困难,代码可能根本无法解析。

C ++ IDE使用1.1版C#和VB.NET设计者采用的原始方法,一切都在一个文件中。 当然,这是不愉快的,声明和代码不应该混在一起。 通过为部分类添加对C#和VB.NET语言的支持,在2.0版本的设计器中解决了这个问题。 然而,C ++ / CLI没有发生这种情况。 不确定原因,与其他团队相比,C ++ / CLI团队总是看起来资源有限。 它也没有任何重构支持,这在类名更改时重命名方法非常重要。 保持方法内联可以避免这个问题。

Anyhoo,您可以在.cpp文件中获取代码,但您必须自己完成。 剪切+粘贴完成它,但您还必须将类名称编辑回方法声明。 这是高维护,考虑是否值得努力。 还要考虑您是否真的想要为用户界面使用C ++ / CLI,这是一个不寻常的选择。

函数原型(您称之为过程定义)应该放在头文件中(以及宏)。 任何代码都应该放在.cpp文件中。

如果你确定你想要移动的是代码,它应该被移动到那里。 粘贴一些代码会很有帮助。

标题(* .h)文件假定包含类,方法和类型的定义,而cpp文件假定具有实现细节。 在头文件中也常常使用内联和短方法。

编译器不强制执行此操作,因此您可以在头文件中编写实现(即代码)。

就个人而言,我正在将自动生成的代码移动到* .cpp文件中。 在* .h文件中,我要离开的功能不会经常更改。 我这样做是为了确保在我做出的每一次改变之后,编译时间不会增长太多。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM