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

时间:2012-04-19 02:36:45

标签: c++ c c-preprocessor

我将在此示例中使用openssl安装的头结构:

/usr/include       (or some folder in include search path on Windows box)
  |
  + --openssl
       |
       +-- e_os2.h
       +-- rsa.h
       +-- sha.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 <...> vs #incldue "..."方面表现不同的事实,像openssl这样的lib包含它的头文件的正确方法是什么?

我想,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等)?

1 个答案:

答案 0 :(得分:3)

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