malloc.h
是一个非标准的C头文件,它声明与内存管理有关的C标准库扩展函数。它可用于Linux操作系统。
我希望我的程序能够在许多平台上编译,但只有在malloc.h
功能可用时才使用它。
如何在编译期间(通过宏)检查是否为我的C程序提供了malloc.h
库?
编辑:解决方案也可以通过间接方式实现,例如检查操作系统或其他任何内容。
malloc.h
是一个非标准的C头文件,它声明与内存管理有关的C标准库扩展函数。它可用于Linux操作系统。
我希望我的程序能够在许多平台上编译,但只有在malloc.h
功能可用时才使用它。
如何在编译期间(通过宏)检查是否为我的C程序提供了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
通过宏
无法通过“宏”检查头文件是否存在。
通常,创建一个包含#include <malloc.h>
的小程序并尝试编译该程序。如果编译成功,则表示该头文件可用。构建系统是专门为自动化此类任务而创建的工具,例如:cmake中的CHECK_INCLUDE_FILE()
,autoconf中的AC_CHECK_HEADER()
,scons中的conf.CheckCHeader
,meson中的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库的系统上编译这个程序,你会得到如下错误:
gcc test.c test.c:2:18: fatal error: malloc.h: No such file or directory #include <malloc.h> ^ compilation terminated.
如果malloc.h可用,程序将可以编译而不出错。
malloc.h
中声明的任何非标准特性的系统,那么为什么您需要在任何地方使用malloc.h
呢?请注意,您不需要它来使用malloc
/calloc
/realloc
,因为这些函数在符合C语言规范的任何C库中都已在stdlib.h
中声明。 - John Bollinger