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

How do I detect if stdio.h is included?

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

void foo(FILE *f); 

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

等等。

显然,要使用此 header,我需要执行以下操作

#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 header 做了什么,比如 stdlib.h?

<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. It looks like stdin is required to be some macro 的评论是错误的,然后您可以使用 #ifdef stdin ... endif 作为 Alter Mann 正确回答。我认为它的可读性不是很好,您只想包含 <stdio.h>,可以自己将其包含在您的 foo.h 中,也可以在您的文档中要求它。

与 C++ 标准头文件相反,C 标准头文件实际上可以很快编译,所以我认为不值得优化 <stdio.h> 没有 的异常情况 已收录。

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