如何检测是否包含 stdio.h?
How do I detect if stdio.h is included?
我有一个 header foo.h
文件声明了一个函数原型
void foo(FILE *f);
/* ... Other things that don't depend on FILE ... */
等等。
显然,要使用此 header,我需要执行以下操作
#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 header 做了什么,比如 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. It looks like stdin
is required to be some macro 的评论是错误的,然后您可以使用 #ifdef stdin
... endif
作为 Alter Mann 正确回答。我认为它的可读性不是很好,您只想包含 <stdio.h>
,可以自己将其包含在您的 foo.h
中,也可以在您的文档中要求它。
与 C++ 标准头文件相反,C 标准头文件实际上可以很快编译,所以我认为不值得优化 <stdio.h>
没有 的异常情况 已收录。
打开你的 stdio.h
文件(针对你的编译器),看看它是否有 _STDIO_H 或类似的定义。
我有一个 header foo.h
文件声明了一个函数原型
void foo(FILE *f);
/* ... Other things that don't depend on FILE ... */
等等。
显然,要使用此 header,我需要执行以下操作
#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 header 做了什么,比如 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. It looks like stdin
is required to be some macro 的评论是错误的,然后您可以使用 #ifdef stdin
... endif
作为 Alter Mann 正确回答。我认为它的可读性不是很好,您只想包含 <stdio.h>
,可以自己将其包含在您的 foo.h
中,也可以在您的文档中要求它。
与 C++ 标准头文件相反,C 标准头文件实际上可以很快编译,所以我认为不值得优化 <stdio.h>
没有 的异常情况 已收录。
打开你的 stdio.h
文件(针对你的编译器),看看它是否有 _STDIO_H 或类似的定义。