【发布时间】:2015-02-16 17:08:49
【问题描述】:
例如foo.h:
typedef struct foo_t foo_t;
/* Lots of function declarations dealing with foo_t... */
int foo_print(const foo_t *foo); /* Print foo to stdout. */
int foo_fprint(FILE *f, const foo_t *foo); /* Print foo to file f. */
我不想在foo.h 中乱扔foo.h 的用户可能不想包含的太多其他头文件,但我确实需要声明采用FILE* 等类型的函数。我怀疑我是第一个遇到这种困境的人,那么人们在这种情况下通常会怎么做呢?还是我想避免在我的头文件中包含stdio.h 被误导了?
编辑:
人们似乎不理解我的问题。为了澄清,这里有一些潜在的解决方案:
- 只需包含
stdio.h,不用担心它会在我的客户代码中引起冲突(例如,如果他们碰巧有自己的函数恰好被称为getchar)。 - 使用
#ifdef查明stdio.h是否已被包含,然后才声明FILE*相关函数。这样做的缺点是它会在我的客户代码中对#includes 施加特定的顺序。 - 将所有与 I/O 相关的声明移至单独的头文件,例如
foo_io.h。
什么问题是最好的事情?
【问题讨论】:
-
I don't want to litter foo.h with too many other header files that users of foo.h might not have wanted to include所以你想把你的客户的负担交给#include <stdio.h>,否则你的代码不能编译?您的代码应该在没有“用户干预”的情况下编译。 -
问题是,没有头文件可以让你正确转发声明
FILE(因此可以使用FILE *而不包括stdio.h),就像其他I/O一样(iosfwd)。所以你必须使用包含。 -
写。编辑后的问题:正确答案是 1. 或 3. 如果您担心引入大量额外的标题和名称。无条件的
#include <stdio.h>应该永远对您的客户来说是个问题。这是 C:没有命名空间。如果您选择标准库中已经存在的名称这是您的错。 -
@Matt: 对——如果是
static,那么你的标题#include <stdio.h>不会干扰它。 -
@Matt:抱歉,我之前的评论并不完全正确。如果
getchar()的标准声明和getchar的静态声明很可能是编译时错误。 (没有链接时冲突,因为static函数没有链接。)不过,我想说这不值得担心。如果需要使用FILE*,则需要包含<stdio.h>。
标签: c++ c coding-style header-files declaration