问题标签 [opaque-pointers]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
100 浏览

c++ - 从 opque 指针投射的结构成员上的 memcpy()

假设我有一个 API:

该方法中是否有任何未定义的行为A::WriteVal

由于以下原因,我的猜测是否定的:

  1. 重新解释 auint64_t *Impl *它自己之间的转换是可以的,因为指针类型的对齐方式是相同的。
  2. 如果ptr要明确取消引用,则只有 UB,因为这会破坏严格的别名规则。
  3. memcpy无论指针的原始类型如何,都可以安全地用于替代显式取消引用。

我的推理正确吗?如果这也被认为是 UB,那么是否有一种很好的 C++ 方式来写入不透明类型而没有非法类型双关语方法。

我的目标是对一个不透明的值进行干净的操作,在底层,它代表一个用户不应该知道细节的结构。

0 投票
2 回答
142 浏览

c - 如何正确定义处理不透明指针的内联函数?

如何正确定义根据 C99 标准取消引用不透明指针的内联函数?假设我在三个文件中组织了一个程序:

opaq.h:

opaq.c:

主.c:

我想opaq_sizemain.c中内联。据我所知,这种内联是可能的,因为内联可以在链接期间发生。但是,尝试使用 GCC 编译它会给出以下警告:

externopaq.h中使用关键字会给出相同的警告。编译-fgnu89-inline解决了警告,但是反汇编main表明内联实际上并没有发生。请注意,我无法在标题中定义函数(as static inline),因为结构定义超出了范围。

0 投票
0 回答
80 浏览

c - 当通过双重引用传递给集合函数时,如何访问 C 中不透明数据结构的成员?

我是 C 新手,我正在使用通过双重引用传递的不透明数据结构。我已将 cars.h 中的结构原型声明为typedef struct car car. 然后在 cars.c 中我继续定义具有以下成员的结构:

我有一个设置汽车年份的功能:

set_year但是,我看不到结构的成员,尽管car它们都在 car.c 中定义。如何正确访问这些成员?

*编辑

这是我的问题的解决方案:

0 投票
3 回答
91 浏览

c - 无法从常驻 .c 文件访问的不透明指针

当从定义文件访问不透明结构内部的结构时,我遇到了一个奇怪的分段错误。我最近刚刚了解了不透明指针,但我的猜测是,我在分配内部结构时做错了。但是,在第一次调用该结构时,它似乎可以工作,并且在同一方法中无法访问它。

所以我在里面定义了我的不透明结构指针connection.h

然后在connection.c我内部分配servtype 的内部结构指针struct sockaddr_un

connection然后接口方法的分配由客户端处理。对于最小的可重现示例,client类型实现可以像这样处理接口方法分配:

执行后,分配的结构首先似乎被正确分配,并且它的实例可以访问,直到最后一个printf

我的问题是,为什么self->serv在同一方法中使用它后无法访问?

0 投票
2 回答
72 浏览

c - 无拷贝类型注解

在 C 语言中,如果结构包含 futex 或出于任何原因复制或移动到新地址没有意义,是否有任何方法(类型注释或其他东西)来限制/警告用户意外复制这些对象?

0 投票
0 回答
51 浏览

c# - 在 C# 中返回一个不透明对象

我对 C# 不是很熟悉,也无法在任何地方找到合理的答案。我只是想从一个对调用者来说是不透明的函数返回一个对象。我仍然希望用户能够传递对象,我只是不希望他们调用对象上的任何方法。

在 C++ 中,您只需返回一个 void*,然后接收该对象的函数会将其转换为适当的类型并调用其上的方法。

就我而言,我只是不想完全相信用户可以访问 Blob 方法,所以我希望对象是不透明的。在 Win32 API 中,所有类型的 Windows 结构都像 void* 指针一样不透明。

现在我知道您可以使用“不安全”并且可能在 C# 中做同样的事情,但我想知道 C# 中是否有更好的方法来做到这一点?

** 编辑 ** 忽略我的人......我是个疯子......答案很简单。该方法所要做的就是返回对象而不是Blob,然后它就完成了。对不起,这是一个经过认证的大脑放屁。

0 投票
1 回答
34 浏览

ios - 在 UserDefaults 中存储 OpaquePointer 类型

我正在使用 Xcode 12 和 Swift 5 环境来构建 iOS 应用程序。

我需要在视图消失之前(或在应用程序关闭之前)存储一个 OpaquePointer 类型变量(以下代码中的“self.loggers”),并在视图出现时(当应用程序运行时)检索它。我尝试使用 UserDefault 如下,

但是,NSKeyedArchiver 未能对此类类型进行编码。之后,我创建了一个包装变量的类。

并更改了我的代码

但是,这会在调用 NSKeyedArchiver.archivedData 时给出 SIGABRT。有没有办法在 UserDefaults 中存储 Opaquepointer 类型?如果没有,使用核心数据可以解决这个问题吗?

谢谢你。

0 投票
3 回答
129 浏览

c - 在不知道结构实现的情况下如何编写通用列表?

假设有一个员工ADT,例如

, 客户端代码将是

现在客户想使用列表 ADT 将 Kevin 和 John 插入到列表中以执行某些任务。

所以客户端代码将是

因为employee是用不透明指针封装的,所以list没有办法复制它。

如何为列表编写 ADT 和实现?

0 投票
3 回答
92 浏览

c - C中OO继承的别名问题

我正在使用 C 进行继承(即使用子类数据类型调用超类的函数),但遇到了别名问题。

在下面,shape函数是用rectangle对象调用的。

在 的情况下me->superxy是正确的。然而,他们错了(Shape*)me

我更喜欢的原因(Shape*)meme->super我想对客户隐藏结构实现。

C标准不应该保证吗?根据第 6.7.2.1.13 节

“……一个指向结构对象的指针,经过适当的转换,指向它的初始成员。结构对象内可能有未命名的填充,但不是在其开头”。



0 投票
0 回答
30 浏览

llvm - LLVM 是否关心不透明类型之间的区别?

根据https://llvm.org/docs/LangRef.html#opaque-structure-types

不透明结构类型用于表示没有指定主体的结构类型。这对应于(例如)前向声明结构的 C 概念。它们可以命名 (%X) 或未命名 (%52)。

看起来很简单,但我想弄清楚的一件事就是这个。假设我们有两种不透明类型:

LLVM 是否关心这是两种不同类型的事实?是否存在用 X 代替 Y 会导致生成不同代码的情况?想到的一种可能性是基于类型的别名分析,但是,不可能取消引用不透明类型,所以看起来它没有办法有所作为。我错过了什么吗?