我有一个头文件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?
解决方法
< 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>时优化不寻常的情况是值得的.没有包括在内.