我有一个标题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
?
答案 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>
不}时,我认为不值得优化这种不寻常的情况。 em>被包括在内。
答案 1 :(得分:0)
打开您的stdio.h
文件(针对您的编译器)并查看它是否具有_STDIO_H或类似的定义。