gpt4 book ai didi

c++ - 什么是 C++ 中的不透明值?

转载 作者:IT老高 更新时间:2023-10-28 12:42:14 25 4
gpt4 key购买 nike

什么是 C++ 中的“不透明值”?

最佳答案

“不透明”在英语中的定义是“不能被看穿;不透明”。在计算机科学中,这意味着一个值除了值本身的类型之外不透露任何细节。

人们经常使用 C 类型 FILE 作为经典示例,但这通常是不是不透明的 - 详细信息在 stdio.h 中揭示任何人都可以看到,他们只是依靠该类型的用户来不摆弄内部结构。这很好,只要人们遵守规则,只将这些值传递给像 fread()fclose() 这样的函数,但是泄露信息的问题是人们有时(愚蠢地)开始依赖它。

例如,glibclibio.h 中发布其 FILE 结构(如 struct _IO_FILE),这样type 在技术上不是不透明的。

请注意前面的部分定义:“不能”而不是“不愿意”。不透明性要求隐藏信息而不是仅仅制定一个“君子协定”不使用。

正确完成的不透明指针应该显示no信息而不是类型名称本身,并且您可以在C中相对容易地实现它。考虑以下头文件 prog2.h 用于获取和释放 xyzzy 对象:

struct xyzzy;
struct xyzzy *xyzzyOpen (void);
void xyzzyClose (struct xyzzy *fh);

这就是代码的客户端看到的所有内容,一个不完整的类型 struct xyzzy 以及一些用于分配和释放该类型对象的函数(他们看不到 prog2.c 详述如下)。请注意,指向不完整类型的 指针 很好,但您不能实例化该类型的对象,因为您不知道它的内部结构。所以代码:

struct xyzzy myvar;

会导致如下错误:

prog1.c: In function ‘main’:
prog1.c:3:15: error: storage size of 'myvar' isn't known

现在您可以非常愉快地使用程序 prog1.c 中的这些函数,而无需了解结构的内部结构:

#include "prog2.h"
int main (void) {
//struct xyzzy myvar; // will error
struct xyzzy *num1 = xyzzyOpen();
struct xyzzy *num2 = xyzzyOpen();
struct xyzzy *num3 = xyzzyOpen();
xyzzyClose (num1);
xyzzyClose (num3); // these two intentionally
xyzzyClose (num2); // reversed.
return 0;
}

而调用的实现prog2.c,实际上控制并知道内部,所以可以相当自由地使用它们:

#include <stdio.h>
#include <stdlib.h>
#include "prog2.h"

struct xyzzy { int payload; };
static int payloadVal = 42;

struct xyzzy *xyzzyOpen (void) {
struct xyzzy *plugh = malloc (sizeof (struct xyzzy));
plugh->payload = payloadVal++;
printf ("xyzzyOpen payload = %d\n", plugh->payload);
return plugh;
}

void xyzzyClose (struct xyzzy *plugh) {
printf ("xyzzyClose payload = %d\n", plugh->payload);
free (plugh);
}

printf 调用只是为了表明它可以使用内部,您可能希望在生产中添加对 malloc 的返回值的检查-准备好的代码,但这与本示例的目的无关。

当你将 prog1.cprog2.c 编译成单个可执行文件并运行它时,输出为:

xyzzyOpen payload = 42
xyzzyOpen payload = 43
xyzzyOpen payload = 44
xyzzyClose payload = 42
xyzzyClose payload = 44
xyzzyClose payload = 43

正如您对 main 函数的期望。

关于c++ - 什么是 C++ 中的不透明值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3854113/

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