问题标签 [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.
c++ - 从 opque 指针投射的结构成员上的 memcpy()
假设我有一个 API:
该方法中是否有任何未定义的行为A::WriteVal
?
由于以下原因,我的猜测是否定的:
- 重新解释 a
uint64_t *
和Impl *
它自己之间的转换是可以的,因为指针类型的对齐方式是相同的。 - 如果
ptr
要明确取消引用,则只有 UB,因为这会破坏严格的别名规则。 memcpy
无论指针的原始类型如何,都可以安全地用于替代显式取消引用。
我的推理正确吗?如果这也被认为是 UB,那么是否有一种很好的 C++ 方式来写入不透明类型而没有非法类型双关语方法。
我的目标是对一个不透明的值进行干净的操作,在底层,它代表一个用户不应该知道细节的结构。
c - 如何正确定义处理不透明指针的内联函数?
如何正确定义根据 C99 标准取消引用不透明指针的内联函数?假设我在三个文件中组织了一个程序:
opaq.h:
opaq.c:
主.c:
我想opaq_size
在main.c中内联。据我所知,这种内联是可能的,因为内联可以在链接期间发生。但是,尝试使用 GCC 编译它会给出以下警告:
extern
在opaq.h中使用关键字会给出相同的警告。编译-fgnu89-inline
解决了警告,但是反汇编main
表明内联实际上并没有发生。请注意,我无法在标题中定义函数(as static inline
),因为结构定义超出了范围。
c - 当通过双重引用传递给集合函数时,如何访问 C 中不透明数据结构的成员?
我是 C 新手,我正在使用通过双重引用传递的不透明数据结构。我已将 cars.h 中的结构原型声明为typedef struct car car
. 然后在 cars.c 中我继续定义具有以下成员的结构:
我有一个设置汽车年份的功能:
set_year
但是,我看不到结构的成员,尽管car
它们都在 car.c 中定义。如何正确访问这些成员?
*编辑
这是我的问题的解决方案:
c - 无法从常驻 .c 文件访问的不透明指针
当从定义文件访问不透明结构内部的结构时,我遇到了一个奇怪的分段错误。我最近刚刚了解了不透明指针,但我的猜测是,我在分配内部结构时做错了。但是,在第一次调用该结构时,它似乎可以工作,并且在同一方法中无法访问它。
所以我在里面定义了我的不透明结构指针connection.h
:
然后在connection.c
我内部分配serv
type 的内部结构指针struct sockaddr_un
。
connection
然后接口方法的分配由客户端处理。对于最小的可重现示例,client
类型实现可以像这样处理接口方法分配:
执行后,分配的结构首先似乎被正确分配,并且它的实例可以访问,直到最后一个printf
:
我的问题是,为什么self->serv
在同一方法中使用它后无法访问?
c - 无拷贝类型注解
在 C 语言中,如果结构包含 futex 或出于任何原因复制或移动到新地址没有意义,是否有任何方法(类型注释或其他东西)来限制/警告用户意外复制这些对象?
c# - 在 C# 中返回一个不透明对象
我对 C# 不是很熟悉,也无法在任何地方找到合理的答案。我只是想从一个对调用者来说是不透明的函数返回一个对象。我仍然希望用户能够传递对象,我只是不希望他们调用对象上的任何方法。
在 C++ 中,您只需返回一个 void*,然后接收该对象的函数会将其转换为适当的类型并调用其上的方法。
就我而言,我只是不想完全相信用户可以访问 Blob 方法,所以我希望对象是不透明的。在 Win32 API 中,所有类型的 Windows 结构都像 void* 指针一样不透明。
现在我知道您可以使用“不安全”并且可能在 C# 中做同样的事情,但我想知道 C# 中是否有更好的方法来做到这一点?
** 编辑 ** 忽略我的人......我是个疯子......答案很简单。该方法所要做的就是返回对象而不是Blob,然后它就完成了。对不起,这是一个经过认证的大脑放屁。
ios - 在 UserDefaults 中存储 OpaquePointer 类型
我正在使用 Xcode 12 和 Swift 5 环境来构建 iOS 应用程序。
我需要在视图消失之前(或在应用程序关闭之前)存储一个 OpaquePointer 类型变量(以下代码中的“self.loggers”),并在视图出现时(当应用程序运行时)检索它。我尝试使用 UserDefault 如下,
但是,NSKeyedArchiver 未能对此类类型进行编码。之后,我创建了一个包装变量的类。
并更改了我的代码
但是,这会在调用 NSKeyedArchiver.archivedData 时给出 SIGABRT。有没有办法在 UserDefaults 中存储 Opaquepointer 类型?如果没有,使用核心数据可以解决这个问题吗?
谢谢你。
c - 在不知道结构实现的情况下如何编写通用列表?
假设有一个员工ADT,例如
, 客户端代码将是
现在客户想使用列表 ADT 将 Kevin 和 John 插入到列表中以执行某些任务。
所以客户端代码将是
因为employee是用不透明指针封装的,所以list没有办法复制它。
如何为列表编写 ADT 和实现?
c - C中OO继承的别名问题
我正在使用 C 进行继承(即使用子类数据类型调用超类的函数),但遇到了别名问题。
在下面,shape
函数是用rectangle
对象调用的。
在 的情况下me->super
,x
和y
是正确的。然而,他们错了(Shape*)me
。
我更喜欢的原因(Shape*)me
是me->super
我想对客户隐藏结构实现。
C标准不应该保证吗?根据第 6.7.2.1.13 节
“……一个指向结构对象的指针,经过适当的转换,指向它的初始成员。结构对象内可能有未命名的填充,但不是在其开头”。
llvm - LLVM 是否关心不透明类型之间的区别?
根据https://llvm.org/docs/LangRef.html#opaque-structure-types
不透明结构类型用于表示没有指定主体的结构类型。这对应于(例如)前向声明结构的 C 概念。它们可以命名 (%X) 或未命名 (%52)。
看起来很简单,但我想弄清楚的一件事就是这个。假设我们有两种不透明类型:
LLVM 是否关心这是两种不同类型的事实?是否存在用 X 代替 Y 会导致生成不同代码的情况?想到的一种可能性是基于类型的别名分析,但是,不可能取消引用不透明类型,所以看起来它没有办法有所作为。我错过了什么吗?