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

c - 什么是 C 中的不透明指针?

请问C中不透明指针概念背后的用法和逻辑?

0 投票
2 回答
77 浏览

c++ - Obtaining xml data through an opaque pointer

I'm having an issue with retrieving an xml portion of a message using a vendor's api. As an example of what works: getDestination(void* message , void* destination, void* size)

produces: Received message. (Destination: some destination).

Hoever to retrieve the XML portion of the message it requires a function which is getXmlPtr(void* msg, void** xml_ptr, void* xml_length)

So the question is, how do I declare and pass ptr in such a way that I can get the xml information out (the vendor's documentation is really bad) it mostly says that the argument should be a pointer to the application pointer to fill in with the message XML data pointer on return. The programmer may cast the returned void pointer to any reference suitable for the application.

0 投票
2 回答
674 浏览

c++ - 向上转型不透明指针

我正在尝试使用 pimpl 成语。特别是,实现类将实现另一个接口:

我的问题是,在以下情况下可以使用哪些演员表?

在这种情况下 dynamic_cast 可以正常工作吗?在这种情况下是否可以使用其他类型的演员表?

0 投票
1 回答
366 浏览

ios - CGColorRef 不透明类型的对象的 ID

我希望通过这项研究了解 CoreFoundation 对象的内部结构。下面给出了来自免费石英项目的 CGColor 的结构。

保持全局线程安全的唯一值,该值随着创建并分配给 nextID 成员的每个 CGColor 对象而递增。只有未记录的 CGColorGetIdentifier() 函数返回此值。

我检查了 CoreGraphics 及其资源库。我发现只有 ripc_GetColor (libRIP.A.dylib) 函数调用了 CGColorGetIdentifier() 函数,它似乎比较了一些颜色对的 nextID 值。

CGColorGetIdentifier 的调用堆栈;(希望有助于推断 nextID)

CFEqual 首先比较引用,如果它们不相等,则比较内容,因此比较引用是一种正确的方法。如果不更改引用,那么创建和维护唯一的 ID 值将是一种浪费。

因此,可能需要唯一 ID 并比较它们是否相等;

  1. 当存在线程安全问题时,比较 ID 可能优于比较引用。获取引用后,引用指向的内容(数据)可能会在您身后(由另一个线程)更改。
  2. 或者,即使在同一个线程中,为了进一步使用而存储的引用也会被一些其他不可预见的动作释放和/或修改。

所以,我们可以使用一些关于内容的引用,并确保它们可以一直使用(释放内存时引用可能变得无效)。此外,当使用一些数据(如 ID)而不是整个内容时,性能将得到优化。

Apple Core Graphics 的 CGColor 中这个 nextID 的真正意图是/可能是什么?它是从以前的方法遗留下来的,所以不能完全放弃吗?

0 投票
2 回答
1075 浏览

c++ - c++11类成员数组大小constexpr前向声明

我想在使用它们之后从我的包含链中排除一些标题。据我所知,c ++ 11中没有排除“header.h”。

伪代码一厢情愿:

我的问题变得明显的例子如下。请不要争辩这不是一个严重的问题。该示例被分解以显示最小的抽象语言使用。我还将描述老式的解决方案及其缺点。

旧式解决方案

只是另一个header.h:

只是另一个cppunit.cpp:


我目前的解决方案

只是另一个header.h:

只是另一个cppunit.cpp:

因此,上面的代码正在运行。优点是:隐藏复杂性并且没有运行时动态内存间接。嗯?我的意思是,放置 new 允许将整个对象放在堆栈上,并且所有成员地址在编译时都是已知的。我的尝试是在使用不透明指针的界面设计时获得最佳性能。

如果您认为:“这种性能优势不值得思考。” 那么请留下这个问题。


我预期的解决方案

只是另一个header.h:

只是另一个cppunit.cpp:

在我当前的解决方案中,我需要验证 sizeof(bulkywrap_pImpl) 并手动调整 UNKNOWNSIZE。我认为目前无法从编译单元获取任何信息给其他人。我知道这通常是有充分理由的,但这限制了 c++11 的可能性。

我想指出:

jtc1 sc22 wg21 纸 n3337

jtc1 sc22 wg21 纸 n3308

请帮我查找信息天气以及为什么标准不允许这样做。

但此外,我想找到一种解决方案,如何在编译期间将一些文字常量从一个编译单元导出到另一个编译单元。它只是一个文字,所以所有的语句和表达式都不受它的影响。因此编译不依赖于数组的大小来自哪里。

我的建议为 ISO-jtc1-sc22-wg21 和编译器开发人员带来了一些工作,但我没有看到模板和 constexpr 之间有任何相关差异,因为每个定义都必须出现在同一个翻译单元中。这使得模块化编程和干净的接口变得虚假。

不:我不想使用预处理器宏、动态新函数或虚拟成员函数。重要的是最大的 const 正确性,因为类的大小是 const。

请帮忙

0 投票
1 回答
439 浏览

c++ - 模板和不透明指针是否在继承上不兼容?

几乎所有问题都在问题中,但是有什么方法可以通过使用带有模板类的不透明 ptr 来获得封装?(我的直觉是“不”,因为编译器必须在编译时了解所有内容)

像这样的东西,MyClass 应该通过静态库公开,而 MyClassImp 是隐藏的。

这不起作用,因为隐藏在 .cpp 文件中的 MyClass::Foo 如果不包含 MyClassImp 的定义就无法公开,因此您会收到函数丢失错误。

0 投票
1 回答
616 浏览

python - 使用 swig 向 python 公开不透明类型

我正在尝试使用 SWIG 在 C 中包装不透明类型,但我不明白如何。我在下面列出了三个文件:

简单库.c:

简单库.h:

和我的接口文件 simplelibswig.i:

我使用 CMake 构建一切,使用这个 CMakeLists.txt:

现在,我想做的是 1)将不透明类型从 simplelib_MyType 重命名为 MyType 2)使用 %extend 使用构造函数/析构函数/方法公开类型

问题是上面没有暴露构建的python模块中的类型。我希望接口文件将 typedef 公开为具有 typedefed 名称的类,但这并没有发生。因此,我无法继续讨论上面的第 1 点和第 2 点。我究竟做错了什么?

最好的问候, 里卡德

0 投票
1 回答
97 浏览

javascript - 为.click目的检测div中的透明度?

我将三个元素层叠在一起,每个元素都包含一些透明度。中间没有透明度,只有边缘。我希望能够单击背景中的 div,但是因为通向最前面 div 边缘的透明空间在它上方,所以最前面 div 的单击事件会触发。我不能禁用它或使用 stopPropegation() 显然,因为前面的那个仍然需要可点击。

是否有任何解决方案可以检测透明空间并将其与不透明空间区分开来?谢谢!

0 投票
1 回答
515 浏览

c - C中的不透明数据类型

C 中返回不透明数据类型的首选方法是什么?

还有其他更惯用的选项吗?

0 投票
2 回答
599 浏览

c - 不透明结构指针

在我的库中,我有一个实例结构,其中包含库所需的所有内容,这样您就可以定义库的多个实例。该库要求用户定义自己的扩展或自定义变量。

这是我尝试过的:

图书馆.h

然后用户可以这样做:

主程序

但是我收到“分段错误”的错误。