我想做一些看起来不可能的事情。是否可以隐藏标准头部的一部分(C)?
我想写3个文件:main.c中,了foo.h,foo.c的。
的想法是在foo.h中或foo.c的以这样的方式,它的成员是在main.c中可见定义结构。其中一个结构成员的类型为FILE
,如标准标头<stdio.h>
中所定义。但<stdio.h>
的功能和宏必须在文件main.c内不可见。
该解决方案必须符合标准C(C99和/或C11)和便携式。 这可能吗?
头foo.h中被包含(#include)在两个,main.c中和foo.c的。
标准标头<stdio.h>
#仅包含在foo.c中,但不包含在main.c中。
我要声明一个struct
如下:
struct myfile_s {
FILE *F;
char *filename;
char buff[100];
} myfile;
对于接下来,只有成员FILE *F
是很重要的。
结构myfile
将通过出现在foo.c中的函数进行初始化和修改。
这样做的目的是做在foo.h中,这反过来又在foo.c的被定义声明myfile
通过extern
功能的文件操作。
文件操作涉及标准功能<stdio.h>
,但这些功能必须隐藏在文件main.c中。 但是,我想直接从main.c访问myfile
的成员。 这意味着struct myfile_s
的定义必须在foo.h中完成(也就是说,它不能被使用不完整结构声明的技巧“延迟”,如struct myfile_s ;
)。
总之,我希望该类型FILE
在main.c中和/或foo.h中是可见的,但<stdio.h>
声明其余一直隐藏了他们。
另一个限制:直接复制“手头上”提供的FILE
的定义不可取,因为代码必须是可移植的。
我的第一次尝试是通过将其写入foo.c来隐藏struct myfile
。
该代码是:
foo.h中
struct myfile_s;
struct myfile_s myfile;
extern void startfile(struct myfile *f);
的foo.c
#include <stdio.h>
#include "foo.h"
struct myfile_s {
FILE *F;
char *filename;
char buff[100];
} myfile;
void startfile(struct myfile *f)
{
// Do some stuff...
}
的main.c
#include "foo.h"
int main(void)
{
myfile.F = NULL; // This kind of access bring error, but I want to do it anyway!!
startfile(&myfile);
return 0;
}
延迟struct myfile_s
声明避免了需要包括<stdio.h>
在foo.h中,所以头工作正常,但结构类型仍然不完整,所以获得myfile.F
不能main.c中来完成。
因此:如何访问myfile.F?
我尝试另一种方式,当然,给出了错误太:
foo.h中
struct myfile_s {
FILE *F;
char *filename;
char buff[100];
} myfile;
extern void startfile(struct myfile *f);
foo.c的
#include <stdio.h>
#include "foo.h"
void startfile(struct myfile *f)
{
// Do some stuff...
}
对于使用两个不同的头文件是不是足够了?一个内部的头文件和一个外部?外部只知道void指针(或者在你的情况下是结构的FILE指针部分),而在内部你将这些void指针指向你的类型,所以具有内部头文件的指针知道你想保持内部的部分,并且外部头部jsut显示你想要发表什么。 – dhein
您是否曾尝试在'foo.h'中包含'',即您在哪里定义您的结构体......我更愿意在标题中声明 –
什么不适用于第二种方法?它看起来大部分在正确的轨道上。 –