【问题标题】:Header included but declarations still missing?包含标题但仍缺少声明?
【发布时间】:2010-02-21 22:19:35
【问题描述】:

这是一个简单的例子:

#include <stdlib.h>

int main(void) {
    _set_error_mode(_OUT_TO_STDERR);
    return EXIT_SUCCESS;
}

在编译这个程序时,我遇到了以下问题:

main.c: In function 'main':
main.c:4: error: implicit declaration of function '_set_error_mode'
main.c:4: error: '_OUT_TO_STDERR' undeclared (first use in this function)
main.c:4: error: (Each undeclared identifier is reported only once
main.c:4: error: for each function it appears in.)

标题确实包含函数声明和宏:

_CRTIMP int __cdecl __MINGW_NOTHROW _set_error_mode (int);
# define _OUT_TO_STDERR 1

我怎么会得到错误?请注意,我还使用了EXIT_SUCCESS 宏,它也在同一个stdlib.h 标头中定义,但出于某种原因,GCC 不会抱怨它。奇怪。

我在 Vista 机器上使用 MinGW + GCC。

【问题讨论】:

  • 那么,您是否检查过您的stdlib.h 中的声明是否被某个宏(即#ifdef/#endif 块)“禁用”了?
  • 在 Win2K 机器上使用 MinGW GCC 4.4.1 为我编译。
  • 关于它们被其他宏禁用:标题是一团糟 - 它很大并且到处都包含嵌套的 ifdef。很难找出可能导致问题的原因。似乎必须定义 __MSVCRT__ 才能使该功能可用,但这并没有帮助。顺便说一句,尼尔以某种方式工作。我们是否使用不同的stdlib.h 文件?
  • 在我的系统中,如果您处于严格的 ANSI 编译模式(即指定了 -ansi),则不包含这些函数。这有点道理。这是否是您的实际问题完全是另一回事。
  • 通过使用 -E 编译进行检查,在生成的预处理源中搜索 stdlib.h 的内容。您将确切地看到哪些行进出。

标签: c gcc mingw


【解决方案1】:

你的代码 sn-p 在 MinGW 3.4.5 上对我来说很好

您确定您的包含文件路径设置正确吗?可能正在处理错误的stdlib.h。或者,也许 MingGW 没有定义 __MSVCRT__ ,这是获得该功能原型所必需的(MinGW 似乎为我自动定义了它 - 我不确定如何将其关闭)。


编辑:

tyranid 的评论似乎有答案 - 如果我指定 -ansi 选项,我会得到与您的示例完全相同的一组错误。

设置为 CW 并在 tyranid 发布答案时删除。

【讨论】:

  • 是的,-ansi 是问题的原因。谢谢。
猜你喜欢
  • 2013-11-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-10-04
相关资源
最近更新 更多