C++ 通过编程检查头文件是否存在的最佳方法?

C++ 通过编程检查头文件是否存在的最佳方法?,c++,c,configure,C++,C,Configure,只是为了测试编译一个包含头文件的简单程序吗 为了更好地理解编译过程,我正在编写自己的“configure”,它测试是否存在一些头文件和库文件。是的,使用编译器编译简单的测试程序。这是查看编译器是否可以找到头的最好、最简单的方法。如果您硬编码#包含搜索路径,您将始终必须修改并适应不同的编译器。GNU套件通过运行测试编译来检查标题。仅测试文件“filename.h”是否存在就相当简单: #include <filename.h> int main(void){return 0;} #包

只是为了测试编译一个包含头文件的简单程序吗


为了更好地理解编译过程,我正在编写自己的“configure”,它测试是否存在一些头文件和库文件。

是的,使用编译器编译简单的测试程序。这是查看编译器是否可以找到头的最好、最简单的方法。如果您硬编码#包含搜索路径,您将始终必须修改并适应不同的编译器。

GNU套件通过运行测试编译来检查标题。仅测试文件“filename.h”是否存在就相当简单:

#include <filename.h>
int main(void){return 0;}
#包括
int main(void){返回0;}

您可能更喜欢引号而不是尖括号。

使用以下程序,您可以找到头文件的存在

#include<stdio.h>
main()
{
        FILE * file;
        if ((file = fopen("/usr/include/stdio.h", "r"))!=NULL)
        {
                fclose(file);
                printf("true");
        }
        perror("err");

}
#包括
main()
{
文件*文件;
if((file=fopen(“/usr/include/stdio.h”,“r”))!=NULL)
{
fclose(文件);
printf(“真实”);
}
佩罗(“err”);
}

您有文件名和包含目录列表。为什么不检查文件是否在其中任何一个文件中?@Nikolai:不这样做的一个原因是“headline”标题本身可能包含其他文件,通过检查这些文件是否都存在比尝试编译更难检查它所依赖的那些文件是否存在。@Jonathan:我理解。当然,这完全取决于项目的范围,但我会对
include
指令进行递归搜索。@Nikolai:小心防护的includes-有时标题中有一个#include行,在本地平台上从未激活过。确定是否包含该标头需要一个C预处理器。是的,可以做到;只要求C预处理器去做可能更容易。@Nikolai:最大的问题是你并不总是知道编译器会在哪里查找文件,尤其是系统库或第三方库。特别是在Unix上,安装多个编译器或同一编译器的不同版本并不少见。或在非标准场所安装图书馆。同意;正如Jonathan Leffler所指出的,Autoconf就是这样做的,这至少是一个对其有利的合理有力的经验投票。批判?您正在搜索的文件的固定名称。您正在查找的文件的固定位置。在编译要查找的程序时使用要查找的文件。正常时在标准输出上打印状态,不正常时在标准输出上打印状态。不返回成功和失败的不同退出状态。使用main-C99的古老C定义需要“int main()”或“int main(void)”,因此这必须是C89或更早的代码。不幸的是,当您没有输入显式返回时,只有C99保证main()的退出状态为零,因此退出状态是未定义的。