我将在本示例中使用 openssl 安装的标头结构:
/usr/include (或 Windows 框中包含搜索路径中的某个文件夹) | + --openssl | +-- e_os2.h +-- rsa.h +-- 沙.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/e_os2.h>
像在openssl中那样做这个决定是错误的吗?a) 或 b) 有什么问题吗?b) 意味着仅从同一个文件夹中包含 e_os2.h,所有主要编译器(ms cl、armcc、intel cl、gcc 等)都能保证吗?