繁体   English   中英

包含标头和C ++文件有什么区别?

[英]What's the difference between including a header and a C++ file?

包含标头(.h文件)和C ++文件(.cpp文件)有什么区别? 创建类时,将创建.h文件和.cpp文件。 如果要使用此类的对象,是否应该同时包含这两个文件? 在哪些情况下应包括.cpp文件?

所谓的文件及其内容是完全约定俗成的。 如果您想蛊惑人心,你可以打电话给你的头文件something.b和源文件something.r -这当然意味着对大多数人来说没有什么用处,有的人可能会认为你的文件中包含的咒骂r而不是C ++源代码。 而且您的编辑器可能不会明白在名为.b文件中它是C还是C ++,而诸如MakesconsCMake等构建工具可能不会理解如何在不“被告知”的情况下编译文件。 [编译器还会查看文件名扩展名,以确定它是否应编译为C ++或C,这当然不适用于“非常规名称”。]

重要的不是文件的名称,而是文件实际包含的内容。 头文件(大多数人称之为something.h )文件应该可以包含在项目中的任何位置,并且可以进行多次(例外情况确实存在,其中头文件并没有被多次包含)在整个项目中-例如,一个version.h ,它声明一个描述当前版本号的字符串]。

源文件(通常被称为something.cpp ,通常应直接传递给编译器进行编译,而不是用作#include "something.cpp" 。)但是,由内容决定的不是名称,而是名称如果使用这种方式,它们就是命名错误的文件。

总结:编译器只是读取传入的源文件,然后将#include “插入”到其编译的代码流中,就像将其粘贴到原始源文件中一样。 编译器并不真正在乎您的文件名是什么,它们来自何处或它们的内容是什么,只要编译器在整个编译过程中都可以。

从编译器的角度来看,包括.cpp.h文件没有什么区别。 但是.cpp.h的内容在通常情况下是不同的。 .cpp文件用于类,函数,静态对象的实现, .h文件用于类定义。 如果将.cpp文件包含到另一个.cpp文件中,则内容将重复,并且由于命名冲突而在链接阶段将失败。

包含标头(.h文件)和C ++文件(.cpp文件)有什么区别?

假设.cpp文件包含一些函数定义,则后一个选项通常不适用于常用的构建系统,并且当.cpp被多个翻译单元所包含时, multiple definition出现multiple definition错误。

可能是在.cpp文件中内联了所有函数定义的例外。

从本质上讲,这是C / C ++预处理器只是将在两种文件类型中找到的文本扩展到当前的翻译单元中。 文件扩展名在这里没有任何作用。

没有区别。 两者都由预处理器作为纯文本处理,以连接到单个文件。 但是,包含源可能会产生不良结果(变量/函数的多个定义)。 头文件通常受包含保护(#ifndef HEADER_H或#pragma一次)保护,以防止其内容重复。

注意:编译器会在预处理(或在编译之前调用预处理器)后完成工作。

暂无
暂无

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

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