C/C++ 预处理器:如何确保包含正确的文件
c/c++ preprocessor: how to ensure that correct file is included
我将在本例中使用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
目录来替换某些标头,那么我假设您知道自己在做什么。
- 如何导出包含具有"std::unique_ptr"值的"std::map"属性的
- 从包含m行的文件中提取n行,必要时(惰性地)重复该文件
- 编译包含字符串的代码时遇到问题
- 正则表达式,包含名称 + "string" + 数字,没有其他内容
- 正则表达式:从模式字符串 1.string2'string3 中提取字符串,其中字符串 1 可以包含 '." 字符
- 如何使用正则表达式匹配不包含特殊字符(&、\、<、>、|、)的字符串,除非它们以反斜杠开头
- 如何为字符串编写正则表达式,其中包含一个数字至少一个数字,并且不包含任何字母
- 修改正则表达式以包含反斜杠和单引号(以便反斜杠表现为转义字符)
- 确保每个标头在大型项目中使用唯一的包含保护
- 在包含正整数和负整数的向量中查找最低缺失的整数?
- 确保字符串只包含字母数字字符的更好方法
- 为什么VS C++中的Path包含正斜杠而不是反斜杠
- C/C++ 预处理器:如何确保包含正确的文件
- 确保可变模板不包含重复项
- 确保包含config.h
- 如何确保正则表达式只在某个字符之后匹配
- 在BSONArrayBuilder中包含正则表达式元素
- 运行时检查失败#0 - ESP值没有正确保存在…检查简单工作线程的点
- CMake 正则表达式匹配包含声明中的标头名称
- 如何在正则表达式匹配结果中包含分隔符