如何检测是否包含stdio.h?

时间:2015-03-18 08:54:35

标签: c stdio

我有一个标题foo.h文件,声明了一个函数原型

void foo(FILE *f); 

/* ... Other things that don't depend on FILE ... */

等等。

现在显然,要使用此标头,我需要执行以下操作

#include <stdio.h>
#include "foo.h"

我想用以下内容包围这个特定的原型:

#ifdef _STDIO_H
void foo(FILE *f);
#endif

/* ... Other things that don't depend on FILE ... */

这样我就可以在不需要特定功能的情况下#include "foo.h"而不用担心#include <stdio.h>

如果我希望我的代码可移植且符合标准,那么#ifdef _STDIO_H是否可行?

我在标准文档中没有提到_STDIO_H,但我发现它在各种C库中使用。我是否应该使用我知道在stdio.h中定义的内容,例如EOF

相关问题:您如何处理其他标准C标头,例如stdlib.h

2 个答案:

答案 0 :(得分:1)

<stdio.h><stdlib.h>是C99(和C11)标准的一部分。因此,每个(托管的)符合标准的C实现都有它们。

在大多数实际实现中,它们是带有include guards的头文件。

符合标准的实施可能非常具体地处理#include <stdio.h>,例如通过使用一些数据库。我不知道这样的实施。

所以简单地添加

#include <stdio.h>

靠近头文件的顶部,类似于

// file foo.h
#ifndef FOO_INCLUDED
#define FOO_INCLUDED
#include <stdio.h>
// other includes ...
// ...
// other stuff
#endif /* FOO_INCLUDED */

或者,您无法关注文档#include "foo.h" 需要之前的#include <stdio.h>;使用足够好的C实现的任何明智的开发人员都可以解决这个问题。

实际上,我对Alter Mann's deleted answer的评论错了。它看起来像stdin is required to be some macro,然后您可以使用#ifdef stdin ... endif作为Alter Mann正确回答。我认为它不具有可读性,您只想将<stdio.h>包括在内,或者将其自己包含在foo.h中,或者将其包含在您的文档中。

与C ++标准标题相反,C标准标题在实践中很快被编译,所以当<stdio.h> 被包括在内。

答案 1 :(得分:0)

打开您的stdio.h文件(针对您的编译器)并查看它是否具有_STDIO_H或类似的定义。