如何检查C语言中是否可用`malloc.h`?

3

malloc.h是一个非标准的C头文件,它声明与内存管理有关的C标准库扩展函数。它可用于Linux操作系统。

我希望我的程序能够在许多平台上编译,但只有在malloc.h功能可用时才使用它。

如何在编译期间(通过宏)检查是否为我的C程序提供了malloc.h库?

编辑:解决方案也可以通过间接方式实现,例如检查操作系统或其他任何内容。


框架挑战:如果您的程序可以适应不提供malloc.h中声明的任何非标准特性的系统,那么为什么您需要在任何地方使用malloc.h呢?请注意,您不需要它来使用malloc / calloc / realloc,因为这些函数在符合C语言规范的任何C库中都已在stdlib.h中声明。 - John Bollinger
3个回答

3
你需要生成一个头文件,比如 config.h,可以使用 autoconf 工具和 shell 脚本创建一个小的 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

2

通过宏

无法通过“宏”检查头文件是否存在。

通常,创建一个包含#include <malloc.h>的小程序并尝试编译该程序。如果编译成功,则表示该头文件可用。构建系统是专门为自动化此类任务而创建的工具,例如:cmake中的CHECK_INCLUDE_FILE(),autoconf中的AC_CHECK_HEADER(),scons中的conf.CheckCHeader,meson中的cc.has_header等。

注意:gcc有一个扩展功能__has_includehttps://gcc.gnu.org/onlinedocs/cpp/_005f_005fhas_005finclude.html,它即将进入C23 https://en.cppreference.com/w/c/23。如果您只针对gcc或仅针对C23,则可以使用#if __has_include(<malloc.h>)


我感谢你的留言。 - Allan Wind

1

最简单的方法是尝试编译一个包含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可用,程序将可以编译而不出错。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接