问题标签 [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 投票
2 回答
2294 浏览

c++ - unique_ptr 到一个不透明的结构?(C++)

一个库定义了一个不透明的数据类型:

并且客户端代码必须获取并发布一个OpaqueStruct*. 我可以访问库源。

不幸的是,既shared_ptr不能unique_ptr也不能存储该指针给出 错误:'sizeof' 对不完整类型的无效应用

我能想到的最好的事情就是借用这个职位的finally 守卫

如何将 RAII 用于不透明的结构指针?

0 投票
1 回答
1421 浏览

c - 如何在 MISRAC:2012 中创建遵循 Dir 4.12 和 4.8 的模块?

这个问题与遵循 MISRAC:2012 指南的 ISO C99 编码有关。

我正在寻找有关 Dir 4.8 “如果指向结构或联合的指针从未在翻译单元中取消引用,则应隐藏对象的实现”以及 Dir 4.12 “不应使用动态内存分配”的指导。

在 C 中实现抽象数据类型时,通常使用句柄来引用 ADT,句柄是指向描述 ADT 内部状态的结构的指针。这可以使用 Dir 4.8 中的不透明指针来完成,其好处是内部细节对用户保持隐藏。

通常这些 ADT 中可能存在多个,因此必须有一种方法来创建多个句柄。这可以通过在初始化函数中为句柄引用的内部细节分配内存来解决,但是在 Dir 4.12 下这是不允许的。

另一种选择是初始化例程接收指向用户提供的静态分配句柄的指针,但是,这不能使用不透明指针来完成。

我在下面说明问题。

这个问题也描述了这个问题 Static allocation of opaque data types,但是没有针对 MISRAC:2012 指南进行讨论。

所描述的一种解决方案是使用静态分配的句柄池,这些句柄池可供客户端代码使用。这个解决方案似乎在技术上是合规的;但是,这里似乎仍然存在动态内存分配的概念。我认为尽管句柄是静态分配的,但编译器无法在编译期间确定是否有足够的句柄可供软件正常运行。

我对这个问题的解决方案是围绕 Dir 4.8 编写一个偏差,并使用非透明指针和强大的命名约定,让用户清楚地知道 ADT 的内部细节不得更改。

我很好奇是否存在满足 Dir 4.8 和 Dir 4.12 且不违反任何其他 MISRAC:2012 规则的公认方法来解决此问题。任何意见将不胜感激。

0 投票
1 回答
273 浏览

c++ - 如何声明第三方定义的不透明匿名结构?

我正在研究第三方模块包装器。我希望我的主头文件没有任何第三方相关的头文件。每个参数类型和返回类型都是不透明的,只需声明它。但是有一个匿名结构定义如下:

我无法修改第三方头文件。我不知道要宣布它。这是我尝试过的和收到的错误消息

1.

2.

如何声明这样的匿名结构?

0 投票
1 回答
116 浏览

haskell - 类型安全的稳定指针

我花了很多时间在我的数据类型中编码不变量,现在我正在努力通过 FFI 将我的库暴露给 C。我没有跨语言障碍编组数据结构,而是简单地使用不透明的指针来允许 C 构建一个 AST,然后在evalHaskell 上只需要将一个字符串编组到 C。

这是一些更有启发性的代码。

然而,据我所知,这似乎将类型安全抛到了窗外。基本上任何 C 交给 Haskell 的东西都会被认为是那种类型,这完全否定了我在 Haskell 中编写 dsl 的原因。有什么方法可以让我获得使用 StablePtr 的好处并保持类型安全?我想要的最后一件事是在 C 中重新实现不变量。

0 投票
1 回答
2996 浏览

ios - 'init()' 已弃用:init() 将在 Swift 3 中删除。使用 `nil`

我正在使用此代码。

但是在 Xcode 7.3 (Swift 2.2) 中,我收到了这个警告。知道为什么吗?我怎样才能摆脱它?

NB 是我使用nil然后我的程序崩溃。

截屏

0 投票
2 回答
251 浏览

c++ - 指向带有模板成员的结构的不透明指针

假设我正在构建一个链表(实际的数据结构完全不同,但一个链表就足够了),其节点看起来像

对于我的数据结构,我有很多返回类型的函数struct node *,我希望用户将此类型视为不透明的。在链表示例中,这样的函数可以是例如get_next(struct node<T> *n)insert_after(struct node<T> *x, struct node<T> *y)。只有很少的功能,即分配nodes 或获取/设置其data字段的功能,需要了解有关T.

有没有更好的方法来“忽略T”并让用户只与typedef struct node * opaque_handle那些不需要关心的功能进行交互T?我的直觉反应,来自 C,只是投到和从void*,但这听起来不是很优雅。

编辑: CygnusX1 的评论让我确信,我在试图规避太多这些保证的同时,我要求类型系统提供太多保证。我将退回到以强制转换和间接Tvoid *代价。

0 投票
3 回答
1107 浏览

c - 没有定义的不透明结构

我正在为我的 hashmap 数据结构设计一个迭代器接口。当前的设计如下所示:

但是,这需要为迭代器对象分配堆,并且客户端必须记住在完成后释放迭代器。如果我map_iterator_new返回堆栈上的迭代器,代码如下所示:

但是,这要求我map_iterator向客户端代码提供结构的定义(否则我会收到不完整的类型错误)。我想隐藏这个定义,只提供声明。

有没有办法做到这一点?本质上,我正在寻找一种方法来告诉客户端代码“此结构占用 X 字节,因此您可以在堆栈上分配它,但我不会告诉您如何访问它的成员”。

编辑:请仅使用标准 C!(没有编译器扩展/特定于平台的功能)

0 投票
1 回答
256 浏览

c - 具有多个定义的不透明结构

我正在考虑用 C 语言实现一个简单的接口模式。

一个关键特征是它将为接口的公共标头提供的不透明结构提供多个定义,也就是说,不同的实现将为该结构提供不同的底层数据(因此跨不同的翻译单元,相同的结构将具有不同的实现)。

无论这将是一个好还是坏的设计模式,我都找不到任何参考。至少它似乎没有违反严格的别名规则,只依赖于公共第一个元素的一致顺序和填充,这是由 C 标准保证的(据我所知)。当然,我知道 C 中面向对象的模式,但我看不到这个特定的模式被使用。

这可以接受吗?甚至使用过这样的模式吗?(我找不到任何东西)

为了便于理解,以下是三个源文件的工作示例:

reader.h(公共接口定义)

reader.c(接口的粘合逻辑)

reader1.h(接口的实现,头文件)

reader1.c(接口的实现,代码)

main.c(示例用法)

接口可能应该为实现者提供另一个头文件,提供包含函数指针的结构头的定义。也许它甚至可以指向一个包含那些以最小化具有许多方法的类的对象大小的类结构。

0 投票
1 回答
1428 浏览

ios - Swift 3 中的 ABAddressBook fromOpaque(_:)

所以我刚刚更新到 Xcode 8 并将我的 Swift 2.3 代码转换为 Swift 3,我在这行代码中有一个错误,它不在 Swift 2.3 中:

现在问题就出来了let person:ABRecord = Unmanaged<ABRecord>.fromOpaque(OpaquePointer(CFArrayGetValueAtIndex(allPeople, index))).takeUnretainedValue()

Xcode 告诉我'fromOpaque' is unavailable: use 'fromOpaque(_:UnsafeRawPointer)' instead。但是我找不到 Xcode 告诉我使用的功能,我只能找到fromOpaque(value: UnsafeRawPointer)我当前正在使用的功能。

我怎样才能使这项工作?

0 投票
1 回答
463 浏览

swift - 初始化 AudioConverterRef Swift 3.0

所以基本上我从这个StackOverflow 答案中找到了上面的代码,它使用的是以前版本的 Swift。现在在 Swift 3.0 中,但是上面的初始化AudioConverterRef器不可用。

我注意到这AudioConverterRef是对音频转换器对象的引用,我想它是一个AVAudioConverter.

所以,简短的问题是我将如何在 Swift 3.0 中编写上述代码?更长的问题是创建AudioConverterRef仅引用 an的用途是什么AVAudioConverter?不是所有的变量都只是引用一个对象吗?