>malloc.h
是一个非标准的 C 标头,它声明了与内存管理相关的 C 标准库的扩展。它在Linux上可用。
我希望我的程序可以在许多平台上编译,但仅在可用时使用malloc.h
功能。
如何在编译时(通过宏)检查malloc.h
库是否可用于我的 C 程序?
编辑:解决方案也可以间接进行,例如检查操作系统或其他任何内容。
你生成(autoconf,shell脚本创建一个小c程序等)一个头文件,比如config.h,它只包含标题(如果可用)。 如果您不想依赖 malloc.h 定义的内容,可以选择定义一个常量:
#include <malloc.h>
#define MALLOC_H_FOUND 1
然后,您编写代码,包含此头文件,并且仅根据 malloc.h 中找到的符号或上面定义的常量执行操作:
#include "config.h"
#ifdef _MALLOC_H // or MALLOC_H_FOUND
// use malloc.c specific features
#else
// fallback
#endif
via macros
无法"通过宏"检查标头是否存在。
通常,创建一个带有#include <malloc.h>
的小型有效程序并尝试编译该程序。如果编译成功,则表示标头可用。构建系统是专门为自动化此类任务的目标而创建的工具,例如:cmake中的CHECK_INCLUDE_FILE()
,自动AC_CHECK_HEADER()
中的,scons中的conf.CheckCHeader
,介子中的cc.has_header
等。
注意:有一个 gcc 扩展__has_include
https://gcc.gnu.org/onlinedocs/cpp/_005f_005fhas_005finclude.html 即将进入 C23 https://en.cppreference.com/w/c/23 .如果您只针对 gcc 或仅针对 C23,您可以使用#if __has_include(<malloc.h>)
.
最简单的方法是尝试编译一个包含 malloc.h 的程序,然后检查编译器的返回代码。如果编译器返回错误,则 malloc.h 不可用。
下面是一个简单的示例:
#include <stdio.h>
#include <malloc.h>
int main() {
printf("Hello, world!n");
return 0;
}
如果您尝试在没有 malloc.h 的系统上编译此程序,则会收到如下错误:
海湾合作委员会测试.c test.c:2:18:致命错误:malloc.h:没有这样的文件或目录 #include
^ 编译终止。
如果 malloc.h 可用,程序将编译而不会出错