2010-02-21 71 views
1

这里有一个简单的例子:包含标题但声明仍然丢失?

#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。

+0

那么,你是否检查过你的'stdlib.h'中的声明是否被某个宏(即'#ifdef' /'#endif'块)禁用了? – AnT 2010-02-21 22:22:47

+0

在Win2K机器上用MinGW GCC 4.4.1编译。 – 2010-02-21 22:23:59

+0

关于他们被其他宏禁用:头是一团糟 - 它很大,并且包含嵌套的ifdefs。很难找出可能导致问题的原因。看起来'__MSVCRT__'必须被定义为可用的函数,但是这没有帮助。顺便说一句,尼尔有它的工作。我们是否使用不同的'stdlib.h'文件? – Ree 2010-02-21 22:42:01

回答

1

您的代码段工作正常,我使用MinGW 3.4.5

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


编辑:

tyranid的评论似乎有了答案 - 如果我指定-ansi选项,我得到了完全相同的一组错误的,如你的榜样。

设置为CW,如果tyranid发布答案,将会删除。

+0

是的,-ansi是问题的原因。谢谢。 – Ree 2010-02-22 07:37:01