微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如何检测是否包含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>时优化不寻常的情况是值得的.没有包括在内.

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐