我有一个标题 foo.h
声明函数原型(prototype)的文件
void foo(FILE *f);
/* ... Other things that don't depend on FILE ... */
除其他事项外。
很明显,要使用这个 header ,我需要执行以下操作
#include <stdio.h>
#include "foo.h"
我想用类似下面的东西围绕这个特定的原型(prototype):
#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>
;使用足够好的 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 - 如何检测是否包含 stdio.h?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29117606/