gpt4 book ai didi

c - C 中的文件描述符。将它们拖到周围与静态全局

转载 作者:太空宇宙 更新时间:2023-11-04 07:01:21 25 4
gpt4 key购买 nike

如果我正在编写一个使用文件描述符来执行操作的库,我应该什么时候从 lib_init() 返回它?供更高层代码使用并传递给我的 lib_do_stuff()调用,什么时候可以将它作为 .c 文件中的静态全局变量保留在我的 C 库中作为私有(private)“成员”?

如果我认为我的库的用户不应该控制甚至访问文件描述符,我可以保留它吗,就像在 C++ 中一样,它只是 private

这两种方式的缺点是什么?

最佳答案

用一个例子扩展我的建议。

您的库需要两个(至少)头文件:一个是您库的用户包含的公共(public)头文件,另一个是您仅包含在您的库源文件中的私有(private)头文件。

公众可能是这样的

#pragma once

// This is all that is needed to declare pointers to the internal structure
typedef struct internal_structure STRUCTURE;

// The public API of your library
STRUCTURE *lib_init(void);
void lib_cleanup(STRUCTURE *s);
...

那么你就有了私有(private)头文件

#pragma once

struct internal_structure
{
int fd;
// Other members as needed
...
};

// Possible function prototypes of private functions

然后在您的库源文件中包含公共(public)头文件和私有(private)头文件,并使用 STRUCTURE 作为黑盒结构:

#include <stdlib.h>
#include "public.h"
#include "private.h"

STRUCTURE *lib_init(void)
{
STRUCTURE *s = malloc(sizeof *s);
s->fd = open(...);
// Other initialization
...
return s;
}

void lib_cleanup(STRUCTURE *s)
{
// Other cleanup
...
close(s->fd);
free(s);
}

那么你的库的用户只包含公共(public)头文件,并使用你定义良好的 API:

#include "public.h"

int main(void)
{
STRUCTURE *s = lib_init();
...
lib_cleanup(s);
return 0;
}

公共(public)函数都应该将STRUCTURE * 作为它们的参数之一,通常是它们的第一个参数,类似于lib_cleanup 函数。然后该函数可以以任何他们想要的方式使用该结构及其成员。

关于c - C 中的文件描述符。将它们拖到周围与静态全局,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37934172/

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