Gcc 为什么要在项目中使用“包含下一个”?
引用iOS的话:Gcc 为什么要在项目中使用“包含下一个”?,gcc,include,c-preprocessor,Gcc,Include,C Preprocessor,引用iOS的话: #include_next不会区分和“文件”包含,也不会检查您指定的文件是否具有相同的内容 名称为当前文件。它只是查找名为的文件,开始 搜索路径中的目录位于当前 文件被找到 使用“include#u next”可能会导致极大的混乱。我们推荐 只有在没有其他选择的情况下才能使用。特别是 不应在属于特定程序的标题中使用;信息技术 应仅用于沿以下路线进行全局修正: 包括 所以,有两个问题,下一个是什么?包含?为什么需要使用它?如果您想用自己制作的标题替换默认标题,可以使用它,例如,假
#include_next
不会区分和“文件”包含,也不会检查您指定的文件是否具有相同的内容
名称为当前文件。它只是查找名为的文件,开始
搜索路径中的目录位于当前
文件被找到
使用“include#u next”可能会导致极大的混乱。我们推荐
只有在没有其他选择的情况下才能使用。特别是
不应在属于特定程序的标题中使用;信息技术
应仅用于沿以下路线进行全局修正:
包括
所以,有两个问题,下一个是什么?包含?为什么需要使用它?如果您想用自己制作的标题替换默认标题,可以使用它,例如,假设您想替换“stdlib.h”。您将在项目中创建一个名为stdlib.h的文件,该文件将包括在内,而不是默认的头文件 #如果您想向stdlib.h添加一些内容,而不是完全替换它,那么可以使用include_next。创建名为stdlib.h的新文件,其中包含:
#include_next "stdlib.h"
int mystdlibfunc();
编译器将不再像普通的a#include那样递归地包含stdlib.h,而是在其他目录中继续包含名为“stdlib.h”的文件。如果您支持某个文件的多个版本,这将非常方便。例如,我正在编写支持PostgreSQL 9.4和9.6的代码。存在许多内部API更改,主要是现有函数的新参数 兼容性标头和包装器函数 我可以使用
静态内联
包装器函数编写兼容性头,为所有内容使用新名称,基本上是一个包装器API,在代码中的任何地方都使用包装器名称。用以下词语说某件东西\u compat.h
:
#include "something.h"
static inline something*
get_something_compat(int thingid, bool missing_ok)
{
assert(!missing_ok);
return get_something(thingid);
}
但是把\u compat
或任何后缀分散到任何地方都是很难看的
包装头
相反,在针对旧版本进行构建时,我可以在include路径中插入兼容头,例如compat94/something.h
:
#include_next "something.h"
#define get_something(thingid, missing_ok) \
( \
assert(!missing_ok), \
get_something(thingid) \
)
所以代码的其余部分可以使用9.6签名。在根据9.4构建时,我们将在标题搜索路径前加前缀-Icompat94
需要注意防止多次评估,但如果您使用的是#include_next
,那么您显然不介意依赖gcc。在这种情况下,您也可以使用
当新版本是“主要”目标时,这种方法很方便,但在有限的时间内需要旧版本的向后兼容性。因此,您正在逐步弃用旧版本,并试图保持代码相对于当前版本的整洁
选择
或是一个明智的人,使用C++,使用重载函数和模板内联函数:P
< P>下一个处理器,用它作为预处理器指令,告诉编译器把搜索路径排除在一起,包括文件名文件.h,从解析到这个头文件。通常需要使用两个同名的头文件。仅在绝对必要的情况下,谨慎使用这些功能 例如: 源文件.c的内容与路径1中的常规文件.h相同:#include <file.h>
int main() {
printf("out value: %d", out_val);
exit 0;
}
#包括
int main(){
printf(“输出值:%d”,输出值);
出口0;
}
路径1中的文件.h头文件包含路径2中的文件.h内容:
include_next指示不将路径1子目录用作文件.h的搜索路径,而是将路径2子目录用作搜索路径。通过这种方式,您可以拥有两个同名文件,而不用担心调用对其自身的循环引用。
# include_next <file.h>
int out_val = UINT_MAX - INT_MAX;
#下一步包括
int out_val=UINT_MAX-int_MAX;
路径2内容中的文件.h
#define INT_MAX 1<<63 - 1
#define UINT_MAX 1<<64 - 1
\define INT\u MAX 1 ffmpeg库中的一个示例:\ifndef ffmpeg\u COMPAT\u AIX\u MATH\define ffmpeg\u COMPAT\u AIX\u MATH\35; define class class\u in\u MATH\u causes\u problems\u包含下一个#未定义类#endif/*ffmpeg\u COMPAT\u AIX\u MATH*