c - 如何检测是否包含 stdio.h?

标签 c stdio

我有一个标题 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/

相关文章:

c - 进程如何知道哪个子进程结束了?

c - C 程序中的链接器错误 : LNK2019 and LNK1120

c - C中的动态数组实现

c - 将 printf 重定向到 fopencookie

node.js - 如何将 stdout/stderr 发送到祖 parent 进程?

c - 是否可以直接将常量值写入二进制文件?

c - 为什么 gcc(linux) 中考虑使用 fgets() 以及使用它的替代方法是什么?

c - 从字符串中提取整数

C - 按值传递矩阵?

c - a 是 double , printf ("%d", a); IA32 和 IA32-64 中的工作方式不同