2

我将在本示例中使用 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 等)都能保证吗?

4

1 回答 1

3

你的第一个选择是最容易做错事的;它将在完全属于其他库的标头包中按给定名称查找文件。您的第二个充其量会给出未定义的行为;我不希望它在大多数情况下都能正常工作。第三种方式是正确的方式;它只会包含 openssl 的文件版本。如果您安排通过在包含路径中放置另一个不完整的目录来替换某些标题openssl,那么我假设您知道自己在做什么。

于 2012-04-19T02:48:06.997 回答