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

2024-01-19

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


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

人们经常使用C型FILE作为经典的例子,但通常这是not不透明 - 细节显示在stdio.h任何人都可以看到,他们只是依赖该类型的用户不要摆弄内部结构。只要人们遵守规则,只将这些值传递给诸如fread() and fclose()但披露信息的问题在于人们有时(愚蠢地)开始依赖它。

例如,glibc发布其FILE结构(如struct _IO_FILE) in libio.h因此该类型在技术上并不是不透明的。

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

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

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

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

struct xyzzy myvar;

会导致如下错误:

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

现在您可以非常愉快地使用程序中的这些功能prog1.c without了解结构的内部结构:

#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;
}

And the 执行的通话中,prog2.c,实际上控制和knows内部结构,因此可以非常自由地使用它们:

#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);
}

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

当你编译时prog1.c and prog2.c进入单个可执行文件并运行它,输出为:

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

正如您对 main 函数的期望。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

C++ 中的不透明值是什么? 的相关文章

  • 使用空函数调用 hana::is_valid 的用途是什么?

    Boost Hana https www boost org doc libs 1 61 0 libs hana doc html index html offers boost hana is valid https www boost
  • 如何通知父线程所有子线程都已终止?

    我有一个控制台应用程序正在移植到 WPF 该应用程序有 3 个工作线程 在将一些输出结果打印到屏幕上之前 这些线程都连接到主线程 我的理解是 如果我尝试在 WPF 应用程序中执行相同的操作 GUI 将被阻止并且不会响应用户 那么如何通知父线
  • 我要恢复我的记忆!我怎样才能真正处理一个控件?

    我正在制作一个应用程序 它创建大量的窗口控件 按钮和标签等 它们都是通过函数动态生成的 我遇到的问题是 当我删除控件并处置它们时 它们不会从内存中删除 void loadALoadOfStuff while tabControlToClea
  • 修剪 UIImage 边框

    这是我想要修剪的图像的示例 我想去掉图像周围的边框 在本例中是顶部和底部的黑条 我在Github上找到了一个库 CKImageAdditions https github com cmkilger CKImageAdditions 但是它似
  • CSS 属性名称中的“font-”与“text-”

    CSS 属性名称中使用的术语 文本 和 字体 有什么区别 它们的含义是否相同 或者以以下开头的 CSS 属性名称之间是否存在语义差异font 和一个开头text 例如 为什么我们有这些 CSS 属性 font size 34px text
  • 从套接字读取 C HTTP

    我想知道如何判断是否已从套接字接收到所有数据 这是一个简单的网络代理 现在我正在处理请求部分 所以发送的内容应该以 r n r n 结尾 我不知道请求会持续多久 我在这里读过一些帖子 说我应该检查读取函数是否返回 0 但其他人说0只在客户端
  • 如何删除实体框架6中的多对多关系

    如果将项目连接为多对多关系 则从数据库中删除项目时会出现问题 我的数据库看起来像 Project lt JobInProject gt Job ProjectID JobInProjectID JobID ProjectID JobID 主
  • 如何在Azure功能中添加razor视图文件?

    我正在创建一个应用程序 它是 azure 函数项目 我想在该项目中使用 Razor 视图 我应该在 azure 函数中使用任何模板引擎吗 得益于一些方面的进步剃刀之光项目 https github com toddams RazorLigh
  • ASP.NET中如何访问除wwwroot以外的位置

    我可以使用访问服务器的物理位置Server MapPath 这给了我内部的物理路径wwwroot文件夹 我想将一些数据保存到同一服务器的另一个驱动器中D 驾驶 我想我无法获取以下位置的物理位置D 驾驶使用Server MapPath因为它位
  • 为什么这个单独的定义会导致错误?

    挑战 我有这段代码无法编译 你能找出问题所在吗 有一次让我很头疼 header namespace values extern std string address extern int port cpp file std string v
  • 我可以在 C++ 中重写非虚函数吗

    我想知道我可以重写 C 中的非虚函数吗 因为我在使用 C 时发现了这个问题override关键字我的代码如下 class A public void say cout lt lt From A n class B public A publ
  • 除空字符串外的任何内容的正则表达式

    是否可以使用正则表达式来检测任何不是 空字符串 的内容 如下所示 string s1 string s2 string s3 string s4 etc 我知道我可以使用修剪等 但我想使用正则表达式 s 将匹配任何包含至少一个非空格字符的字
  • 如何在 Visual Studio 2010 Express 中引用 system.drawing?

    我对此有点陌生 我的印象是要绘制我创建的矩形 我需要使用 system drawing graphics 问题是 我收到错误 命名空间 System 中不存在类型或命名空间名称 drawing 您是否缺少程序集引用 当我右键单击解决方案资源
  • 为什么未到达的 try-catch 块会增加运行时间?

    我目前正在创建自己的容器库 但我已经看到无法访问 if 语句无效 try catch阻止增加运行时间 这是我的测试 Vector cpp template
  • 生成范围 [min,max] 内的随机数 [重复]

    这个问题在这里已经有答案了 我正在使用 C 生成范围 min max 内的整数随机数 我在用 int random int int min int max return min rand max min 但我认为上面的代码适用于范围 min
  • 如何组合||条件语句中的运算符[重复]

    这个问题在这里已经有答案了 代替 if foo 1 foo 5 foo 9 我喜欢将它们组合起来 类似于以下内容 这不起作用 if foo 1 5 9 那可能吗 不幸的是不是 你最好的选择是创建一个扩展方法 public static bo
  • 返回 ICollection 而不是 List 的真正优势是什么? [复制]

    这个问题在这里已经有答案了 我读过几篇博客文章 提到对于公共 API 我们应该始终返回 ICollection 或 IEnumerable 而不是 List 返回 ICollection 而不是 List 的真正优势是什么 Thanks 复
  • C# 3.0 中自动属性和公共字段的区别

    我无法理解为什么 C 3 0 中存在自动实现的属性语言功能 当你说的时候有什么区别 public string FirstName than public string FirstName get set 因为它们在生成的 IL 代码 和机
  • 用于 nmap 输出的 C++ xml 解析器

    我是 nmap 的新手 我在 nmap 教程中看到 https nmap org book man output html https nmap org book man output html oX 选项可用于获取 xml 格式的 nma
  • char[length]初始化并处理

    我定义了一个字符数组 char d 6 如果我在以下方面有误 请纠正我 此时没有为变量分配内存d 现在我要初始化它 d aaaaa 这种初始化之后 就不需要释放内存了 它将自动完成 我怎么知道是否char 被初始化了吗 我正在寻找类似的模式

随机推荐

  • 假人的 Getters \ Setters

    我一直在尝试了解 getter 和 setter 但它没有被理解 我读过JavaScript Getter 和 Setter http ejohn org blog javascript getters and setters and 定义
  • 可靠地验证 JWS 证书链和域

    我正在 Node JS 中编写后端代码来验证来自 Google SafetyNet API 的 JWS 我很惊讶没有为此找到现成的模块 因此我开始使用可用的库来研究 JWS 的一些简单验证 首先 谷歌表示需要执行以下步骤 从 JWS 消息中
  • 如何在Windows服务器上运行html文件中的php代码?

    我已使用 htaccess 文件和以下代码AddType 应用程序 x httpd php html htm 它在本地工作正常 但当我将文件上传到服务器上时 它工作不正常 我的所有页面都有 html 扩展名 您需要添加到 PHP exe 的
  • 递归泛型类型

    是否可以在 C 中定义引用自身的泛型类型 例如 我想定义一个 Dictionary 将其类型保存为 TValue 对于层次结构 Dictionary
  • echo 输出与预期的格式化输出不同

    I m using the following formatting for echo 它应该输出粗体和下划线的文本 但不是将其设置为粗体 而是提供 更亮 的颜色变体 并将带下划线的代码 4 视为青色 从而产生浅青色文本 我在 Window
  • 为什么 Enumerator.MoveNext 在与 using 和 async-await 一起使用时不能按我的预期工作?

    我想通过一个枚举List
  • document.title 中的播放符号 (▶) 被压扁

    添加到问题为什么 的 HTML 符号在 document title 中不起作用 https stackoverflow com questions 16930905 why does the html symbol for not wor
  • 使用外部 Python 程序在 OpenOffice 上加载文档

    我正在尝试创建一个 python 程序 使用 pyUNO 来对 OpenOffice 计算表进行一些更改 我之前已在 接受 模式下启动 OpenOffice 以便能够从外部程序进行连接 显然 应该很简单 import uno get the
  • KeyError:

    我一直很难处理烧瓶中的会话 自从我在本地环境中管理应用程序以来 一切都运行良好 包括烧瓶会话 但是当我已经在渲染中托管它时 我总是在每条路线中收到此错误 55 ERROR Error handling request valle de gu
  • 使用 Protractor 检查 DOM 元素中的文本

    这是我在使用 Protractor 测试 Angular 应用程序时尝试做的事情 我想获得某个元素 有点像这样 div class someClass p textFromBoundModel p div 然后获取它的 html 并检查它是
  • 如何在TTabcontrol中隐藏多个选项卡

    我的程序有 3 个下拉菜单和 1 个 ttabcontrol 其中有 5 个选项卡 我需要知道的是 如果下拉菜单选择了特定项目 如何隐藏所有选项卡并再次设置它们的可见性 例如 我的下拉菜单有索引项 A B C A B A C TabCont
  • MySQL 中的数据库注释/描述

    是否可以在 MySQL 中保存有关数据库的额外文本信息 注释 描述等 就像是 SELECT TABLE COMMENT FROM information schema TABLES 但对于数据库 而不是表 不 你不能 Mysql 只允许对表
  • 如何修复获取 URL 时出现的 HTTP 错误。爬行时java中的Status = 500?

    我试图从评论页面抓取用户对 imdb 电影的评分 我的数据库中的电影数量约为 600 000 我使用jsoup来解析页面 如下所示 抱歉 我没有在这里写完整的代码 因为它太长了 try connecting to mysql db Resu
  • Firefox 不会恢复服务器发送的事件连接

    使用Python和CherryPy实现的测试用例 import cherrypy time class Root cherrypy expose def index self return r
  • Ajax 和防止双重“提交”

    我正在处理一个遗留应用程序 他们使用 a 标签来进行许多 Ajax 表单 提交 如果我们使用 input 按钮 我们只需设置 input 标签的禁用属性即可 但在超链接上禁用不是规范的一部分 并且跨浏览器不一致 我们正在寻找一种简单的解决方
  • 在 ViewPager 中实现弹性/弹跳动画效果的最佳方法是什么? [复制]

    这个问题在这里已经有答案了 我想显示一个ViewPager https developer android com reference android support v4 view ViewPager html具有弹跳 弹性滑动效果 我认
  • 谁最初发明了这种类型的语法:-*-编码:utf-8-*-[重复]

    这个问题在这里已经有答案了 Python 将以下内容识别为定义文件编码的指令 coding utf 8 我以前肯定见过这种说明 var value 所以我假设 Python 没有发明它们 也不是唯一使用此类指令的语言 这个语法从何而来 是否
  • 自定义 UITextField 清除按钮

    是否可以自定义清除按钮的图像UITextField 我有一个深色的文本字段背景 x 不够明显 您可以将自己的自定义清除按钮设置为文本字段的rightView财产 确保设置rightViewMode财产给UITextFieldViewMode
  • 使用 Angular 切换列表中的类

    我想在使用 AngularJS 单击元素时切换类 我需要单击的元素来接收类 并需要列表中的任何其他项目来释放类 我已经为此研究了一些假设的解决方案 但是在实施它们时 它们不能正常工作 我不明白为什么它们会这样 建议的一般解决方案是将变量设置
  • C++ 中的不透明值是什么?

    C 中的 不透明值 是什么 不透明 在英语中的定义是 不能被看穿 不透明 在计算机科学中 这意味着除了值本身的类型之外不显示任何细节的值 人们经常使用C型FILE作为经典的例子 但通常这是not不透明 细节显示在stdio h任何人都可以看