gpt4 book ai didi

c - 是否可以隐藏标准 header 的一部分(在 C 中)?

转载 作者:太空狗 更新时间:2023-10-29 17:07:11 26 4
gpt4 key购买 nike

我想做一些看似不可能的事情。

我想写3个文件:ma​​in.c, foo.h, foo.c
这个想法是在 foo.hfoo.c 中定义一个结构,使其成员在 ma​​in.c 中可见。其中一个结构成员的类型为 FILE如标准标题中定义的那样 <stdio.h> .但是<stdio.h>的函数和宏必须在文件 ma​​in.c 中保持不可见。

解决方案必须符合标准 C(C99 和/或 C11)并且可移植。这可能吗?

foo.h 头文件同时包含在 ma​​in.cfoo.c 中。
标准标题 <stdio.h> #included 仅在foo.c 中,但不在ma​​in.c 中。

我想申报一个struct如下:

struct myfile_s {
FILE *F;
char *filename;
char buff[100];
} myfile;

以下内容仅限成员(member)FILE *F很重要。
结构 myfile将被 foo.c 中出现的函数初始化和修改。
目的是对 myfile 进行文件操作通过externfoo.h 中声明的函数,又必须在 foo.c 中定义。

文件操作涉及<stdio.h>的标准函数, 但这些函数必须隐藏在文件 ma​​in.c 中。但是,我想直接从 ma​​in.c 访问 myfile 的成员。 .这意味着 struct myfile_s 的定义必须在 foo.h 中完成(也就是说,它不能通过使用不完整的结构声明的技巧来“延迟”,例如 struct myfile_s ; )。

简而言之,我想要类型 FILEma​​in.c 和/或 foo.h 中可见,但其余的 <stdio.h>声明对他们来说是隐藏的。

另一个限制:直接复制“手边”FILE 的定义的想法由 <stdio.h> 提供将不可取,因为代码必须是可移植的。

我的第一次尝试是隐藏 struct myfile通过将其写入 foo.c 中。
代码是:

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...
}

ma​​in.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 中,所以 header 工作正常,但结构类型仍然不完整,所以访问 myfile.F不能在 ma​​in.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...
}

最佳答案

struct myfile_s {
void *pPrivateThings; // This could be the FILE* or another private structure
char *filename;
char buff[100];
} myfile;

我会在创建时分配另一个私有(private)结构:

struct myprivatefile_s {
FILE *F;
// You could add other fields here that are not public
} myprivatefile;

myprivatefile *privateThings = malloc(sizeof(myprivatefile));
myfile.pPrivateThings = privateThings;
privateThings->F = fopen();

这样您就可以继续添加不需要显示(即私密)的内容到您的心脏内容中。

关于c - 是否可以隐藏标准 header 的一部分(在 C 中)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21254597/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com