Gcc 为什么要在项目中使用“包含下一个”?

Gcc 为什么要在项目中使用“包含下一个”?,gcc,include,c-preprocessor,Gcc,Include,C Preprocessor,引用iOS的话: #include_next不会区分和“文件”包含,也不会检查您指定的文件是否具有相同的内容 名称为当前文件。它只是查找名为的文件,开始 搜索路径中的目录位于当前 文件被找到 使用“include#u next”可能会导致极大的混乱。我们推荐 只有在没有其他选择的情况下才能使用。特别是 不应在属于特定程序的标题中使用;信息技术 应仅用于沿以下路线进行全局修正: 包括 所以,有两个问题,下一个是什么?包含?为什么需要使用它?如果您想用自己制作的标题替换默认标题,可以使用它,例如,假

引用iOS的话:

#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*