C/C++ 预处理器:如何确保包含正确的文件

c/c++ preprocessor: how to ensure that correct file is included

本文关键字:确保 包含正 文件 何确保 C++ 预处理 处理器      更新时间:2023-10-16

我将在本例中使用openssl安装的标头结构:

/usr/include (或 Windows 框中包含搜索路径中的某个文件夹)  |  + --openssl       |       +-- e_os2.h       +-- RSA.h       +-- 沙赫      ...

/usr/include在编译器包含搜索路径中。OpenSSL标头通常以这种方式包含:#include <openssl/sha.h>

作为第一行,openssl/sha.h 包含以下内容:#include <openssl/e_os2.h> 。所以,我的问题:安装的标头以这种方式引用同一文件夹中的标头真的是个好主意吗?当它以这种方式引用 e_os2.h 时,它可能会从其他位置拾取 e_os2.h,不一定与 sha.h 位于同一文件夹中。例如,如果我在某个位置有一个 openssl 包含的本地副本,并以这种方式包含该 sha.h:#include "../../3rdpath/openssl/sha.h那么我可能会通过组合不兼容版本的标头在我的代码中出现一些令人讨厌的错误。

考虑到编译器在#incldue <...>#incldue "..."方面的行为不同,像openssl这样的库包含其标头的正确方法是什么?

我认为,openssl的做法是最错误的方式。另外两种方式是:

a) #include "e_os2.h"

b) #include "./e_os2.h"

openssl 的方式是:

c) #include 

按照openssl的方式做这个错误的决定吗?a) 或 b) 有任何问题吗?b) 表示仅包含来自同一文件夹的 e_os2.h,是否保证所有主要编译器(MS CL、ARMCC、INTEL CL、GCC 等)?

你的第一个选择是最愿意做错事的;它会在完全属于其他库的标头包中找到按给定名称的文件。你的第二个充其量给出了未定义的行为;我不希望它大部分时间都有效。第三条路是正确的路;它将仅包含OpenSSL的文件版本。如果您安排通过在包含路径中放置另一个不完整的openssl目录来替换某些标头,那么我假设您知道自己在做什么。