【问题标题】:Why cant i check if i have included stdlib.h on tdm-gcc compiler?为什么我不能检查我是否在 tdm-gcc 编译器中包含了 stdlib.h?
【发布时间】:2020-09-11 12:06:35
【问题描述】:

我正在用 C 语言编写一个头文件,需要 stdlib.h 才能工作。但是,当我检查是否定义了 _STDLIB_H 时,预处理器会说它不是,即使我包含了文件。我已经在多个编译器上尝试过它,它适用于大多数但不适用于tdm-gcc。我该如何解决这个问题?

【问题讨论】:

  • 你为什么要检查那个?你不能只包括它吗?

标签: c gcc include c-preprocessor


【解决方案1】:

查看stdlib.h 源代码,似乎要在 tdm-gcc 中查找的宏可能是 _TR1_STDLIB_H
因此,您可以尝试以下方法:

#if defined _STDLIB_H || defined _TR1_STDLIB_H

【讨论】:

  • 在我的电脑上,只有 _STDLIB_H 适用于 tdm-gcc v9.2.0。即使只是 _TR1_STDLIB_H 工作。您可以通过将 -M 标志传递给编译器来查看正在使用的确切标头。然后使用文本编辑器浏览标题。
【解决方案2】:

为了更安全地检查 stdlib.h 是否被正确包含,您应该检查 C 标准要求文件定义的宏。

我可能遗漏了一些东西,但我在 C 标准中没有看到任何要求 stdlib.h 定义 _STDLIB_H。我认为这可能只是编译器决定防止多重包含的一种常见方式。

试试类似的东西

#include <stdlib.h>

#ifndef NULL
#error "stdlib.h not included"
#endif

因为 C 标准要求 stdlib.h 定义 NULL

但是从技术上讲,这些都不是必需的...我不知道如果找不到您尝试#include的文件时不会引发致命错误的预处理器@

编辑:

根据 C 标准stdio.h 也定义了NULL,因此检查EXIT_SUCCESSEXIT_FAILURE 可能会更好

【讨论】:

  • NULL 也在 stdio.h 中定义。因此,如果程序包含 stdio.h 而不是 stdlib.h,则不会显示错误“stdlib.h not included”。
猜你喜欢
  • 2013-12-08
  • 2018-04-11
  • 1970-01-01
  • 2015-12-03
  • 1970-01-01
  • 2012-03-25
  • 2015-04-10
  • 2013-01-04
  • 1970-01-01
相关资源
最近更新 更多