为什么头文件会看到源文件的包含?
Why header file sees source file's includes?
我有以下代码:
头文件:
#pragma once
#include <uWS/uWS.h>
typedef __uint32_t ClientID;
typedef __uint16_t Port;
class ClientServer
{
public:
ClientServer();
ClientServer(const ClientServer&) = delete;
ClientServer& operator=(const ClientServer&) = delete;
~ClientServer();
bool run(const std::string& host, Port port);
bool disconnect();
bool isConnected(ClientID id);
bool send(std::initializer_list<ClientID> idList, const std::wstring& message);
};
源文件:
#include <stdint.h>
#include <string>
#include <initializer_list>
#include "client_server.h"
ClientServer::ClientServer()
{
}
如您所见,头文件使用了一些 std 类,例如 std::string
、std::initializer_list
、<stdint.h>
中的类型。而这段代码编译,为什么头文件在源中看到导入的头文件?
因为此源文件包含在其他库标头之后。尝试将其移动到顶部,您将收到编译器错误。
这就是#include
所做的 - 它只是复制头文件内容并将其粘贴到#include
位置。
预处理器指令#include
只是将"头"文件(或任何其他文件(的文本替换("复制粘贴"(到包含#include
指令的文件中。最后,当包含所有内容时,您最终会得到一个平面线性文本文件。毫不奇怪,后面(下面(包含的所有内容都可以看到前面(上面(包含的所有内容。
在C++中,头文件的工作原理是获取头文件的文本并将其放入源文件中#include
的位置。 在本例中,在包含 "client_server.h"
之前,包括 <stdint.h>
、 <string>
和 <initializer_list>
。因此,编译器在头文件之前已经看到了所有这些。
最佳做法通常是在任何其他文件之前包含您自己的单元的头文件,以便确保从头文件中包含所需的所有内容,并且不会意外地导致使用该头的任何其他人出现此问题。
* 从技术上讲,我相当确定它只包含头文件的标记,而不是实际的源代码包含,但在大多数情况下没有区别。
相关文章:
- 给定一个源文件,有没有办法要求 gcc 返回仅直接包含的头文件的列表?
- CMake:如何为每个源文件选择传递哪些包含目录
- 在源文件中包含额外的调试信息,以便在代码::块中使用gdb进行调试
- 是否根据编译器版本有条件地包含源文件
- main.cpp 如何知道包含标头的源文件?
- Visual Studio 2019 不会打开包含源文件的窗口,也不会定位为出现错误的行
- #include "date.h" 创建错误 E1696 无法打开源文件"date.h",也无法打开包含文件:没有这样的文件或目录
- 如何创建用于多个源文件的全局变量/包含/函数
- 为什么头文件会看到源文件的包含?
- C 在多个源文件中包含具有同一类实现的不同标题文件
- 可以将标头文件包含在多个源文件中,而无需重复保护
- 如何将包含多个.cpp源文件的文件夹导入Eclipse项目中,每个源文件都有一个main()定义
- 如何让 CMake 编译包含 Boost Local Functions 的源文件
- 为什么库源文件不包含其标头
- Visual Studio 中的源文件包含
- 包含多个源文件中包含的"const"的头文件
- 编译一个源文件,其中包含在标头中声明的函数
- IntelliSense:无法打开包含路径中的源文件
- C++源文件包含"Unique Mappings"?
- Visual Studio:哪个源文件包含特定的库(带"pragma comment")?