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

我有一个文件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?

解决方法

< 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&gt ;;任何明智的开发人员都可以使用足够好的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>时优化不寻常的情况是值得的.没有包括在内.

相关文章

本程序的编译和运行环境如下(如果有运行方面的问题欢迎在评...
水了一学期的院选修,万万没想到期末考试还有比较硬核的编程...
补充一下,先前文章末尾给出的下载链接的完整代码含有部分C&...
思路如标题所说采用模N取余法,难点是这个除法过程如何实现。...
本篇博客有更新!!!更新后效果图如下: 文章末尾的完整代码...
刚开始学习模块化程序设计时,估计大家都被形参和实参搞迷糊...