C++ 为什么头文件会看到源文件';s包括什么?

C++ 为什么头文件会看到源文件';s包括什么?,c++,C++,我有以下代码: 头文件: #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 C

我有以下代码:

头文件:

#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);
};
#pragma一次
#包括
typedef_uuuint32_ut ClientID;
类型定义uint16端口;
类ClientServer
{
公众:
ClientServer();
ClientServer(const ClientServer&)=delete;
ClientServer&operator=(const ClientServer&)=delete;
~ClientServer();
bool运行(const std::字符串和主机、端口);
bool disconnect();
bool断开连接(客户端id);
bool send(std::initializer\u list idList,const std::wstring&message);
};
源文件:

#include <stdint.h>
#include <string>
#include <initializer_list>

#include "client_server.h"

ClientServer::ClientServer()
{
}
#包括
#包括
#包括
#包括“client_server.h”
ClientServer::ClientServer()
{
}

正如您所看到的,头文件使用了一些std类,如
std::string
std::initializer\u list
,以及
中的类型。这段代码会编译,为什么头文件会在源文件中看到导入的头?

,因为此源文件包含在其他库头之后。尝试将其移到顶部,您将得到一个编译器错误


这就是
#include
的作用-它只需复制头文件内容并将其粘贴到
#include
位置。

因为此源文件包含在其他库头之后。尝试将其移到顶部,您将得到一个编译器错误


这就是
#include
所做的-它只是将头文件内容复制并粘贴到
#include
位置。

预处理器指令
#include
只是将“头文件”(或任何其他文件)的文本替换(复制粘贴)到包含
#include
指令的文件中。最后,当所有内容都包含在内时,您将得到一个平面线性文本文件。毫不奇怪,后面(下面)包含的所有内容都可以看到前面(上面)包含的所有内容。

预处理器指令
\include
只是将“头”文件(或任何其他文件)的文本替换(复制粘贴)到包含
\include
指令的文件中。最后,当所有内容都包含在内时,您将得到一个平面线性文本文件。这一点并不奇怪,包括后面(下)的所有内容都可以看到前面(以上)所包含的所有内容。在C++中,“头文件”通过将头文件的文本放入源代码文件中,在“代码< >位置>包含< <代码> >之前,包含“<代码>”clityServer。h“< /C>您包括
。因此,编译器在头文件之前已经看到了所有这些

最佳实践通常是在任何其他头文件之前包含您自己的单元头文件,这样您就可以确保包含头文件中所需的所有内容,并且不会意外地导致使用头文件的任何其他人出现此问题



技术上,我很确定它只包含头文件的标记,而不是实际源包含,但在大多数情况下,没有区别。C++中的

< P>,头文件通过将头文件的文本放入源代码文件中,在“代码”>的位置包含< <代码> >“client_server.h”,包括
。因此,编译器在头文件之前已经看到了所有这些

最佳实践通常是在任何其他头文件之前包含您自己的单元头文件,这样您就可以确保包含头文件中所需的所有内容,并且不会意外地导致使用头文件的任何其他人出现此问题



*从技术上讲,我相当肯定它只包含头文件的标记,而不是实际的源代码包含,但在大多数情况下没有区别。

\include
的意思正是-编译.cpp文件,就像将包含文件的文本复制/粘贴到.cpp文件中,而不是替换#include指令一样。无关:您不应该这样做您可以自己使用
\uuu int
\uu uint
类型;这些类型是实现的内部类型。您应该使用
uint32\u t
等,它们实际上由
cstdint
定义(您也应该更喜欢
stdint.h
)。您甚至需要在此标题中包含吗?扩展@DanielH的注释。通常,请避免任何带有双下划线的内容。它们不是任何公共界面的一部分,可能会在未经通知的情况下更改。也不要制作带有双下划线的标识符。双下划线已保留供在黑暗中使用e库实现。
#include
的确切含义是:编译.cpp文件时,将包含文件的文本复制/粘贴到.cpp文件中,以替换#include指令。无关:您不应该自己使用
u int
u uint
类型;这些类型是实现的内部类型。您应该使用
uint32_t
等,实际上由
cstdint
定义(您也应该更喜欢
stdint.h
)。您甚至需要在此标题中包含吗?扩展@DanielH的注释。通常,请避免任何带有双下划线的内容。它们不是任何公共界面的一部分,可能会在未经通知的情况下更改。也不要制作带有双下划线的标识符。双下划线已保留供在黑暗中使用e库实现。我这样做:
#include“client_server.h”
#include
#include
#include
但它仍然编译?@AsenValchev
包含什么?好的,就是这样。显然它包含了那些头。我这样做的:
#include“client_server.h”“
#include
#include
#include
但它仍然可以编译?@AsenValchev
包括什么?好的,就是这样。很明显,它包括了那些标题。