【发布时间】:2015-03-18 08:54:34
【问题描述】:
我有一个头文件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?
【问题讨论】:
-
你可以这样做:
struct FILE;而不必担心包含,或检查#ifdef FILE。 -
顺便说一句,您可能会极大地混淆您的用户,这些用户恰好先包含
foo.h,然后是stdio.h。 -
@perreal:有很多事情可能会出错。首先,
FILE和struct FILE在C中不是同一个东西。其次,我不相信标准保证struct FILE的存在。 -
@wigy 我在输入问题时意识到,最明显的问题是只需
#include <stdio.h>并完成它,但这对我来说只是整洁:不包括stdio.h如果我在特定的源文件中不需要它。 -
我不会将此作为答案发布,因为它不会做那件事,但您可以
#include <stdio.h>多次没有问题。认为stdio.h实际上定义了宏_STDIO_H是一个可移植性错误。你可以到达一个实际上并不#define它的系统,然后失败。