【发布时间】: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 的内容。您将确切地看到哪些行进出。