问题标签 [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 回答
179 浏览

c - 将 C 声明转换为 Delphi XE2

我在将一些 C 声明转换为 Delphi XE2 以调用 DLL 中的函数时遇到问题。我翻译了 Visual Basic 源文件中的所有函数声明,但在测试它们时遇到了问题。一些函数返回 Long 值,但在调试我的代码时我观察到这些函数所涉及的返回值是不正确的。然后我转向 C 中的原始代码,在那里我找到了问题的根源:在原始 C 代码中的某个点有这样的声明:

现在,一些函数返回 RSI_CHANNEL;这些函数返回值如下:

并且 ws 被声明为:

rsiChannel 是一个 typedef 结构。到目前为止,一切都很好......到目前为止,我想你们中的一些人可能已经认识到这是 PIMPL 成语。好的,根据源代码注释,我应该保存该返回值(RSI_CHANNEL)并针对 NULL 进行测试,并通过未触及的函数调用传递它......仅此而已......所以我认为它应该在 Delphi 中实现作为指针。但它不起作用。像这样的东西:

没有编译错误,没有运行时错误。如果我调用这个函数,我会得到 Nil。

¿ 知道如何在 Delphi XE2 中实现这一点吗?并且,¿我做错了什么?提前致谢。

额外细节:

  • Delphi XE2(目标:Win32)
  • 视窗 7 x64

我发现了问题;它与我的代码无关,从一开始就是正确的;它与 DLL 中的 ping 函数有关,它可以在笔记本电脑上工作,但它不想与台式机(Win7)一起工作,当它不工作时,它会中断对 DLL 的后续函数调用(为什么,我不知道......但)。无论如何,这不是一个完整的解决方案,但@DavidHeffernan 是第一个提出问题出在其他地方的想法,所以我接受他的回答主要是因为它为我指明了正确的方向。谢谢大家!

0 投票
3 回答
1375 浏览

c# - 在 C# 中创建不透明指针(引用)

我有一个类(基本上是一个链表,所以我们称之为List),它使用另一个类来存储数据(节点,所以我们称之为类Node)。Node具有必须从 调用的方法List,但从其他地方调用它们可能会很麻烦。我需要程序的其他部分来使用 的引用Node,但只能通过List.
在 C++ 中,我将创建另一个类(我们称之为Opaque),它有一个私有指针Node并公开 的一些成员Node,如果将其传递给List,则指向实际的指针Node将被“解包”并在内部使用,但在 C# 中我有没有想到一种方法来隐藏对Node程序其余部分的引用,同时又使其无法访问List
有什么方法可以做到这一点,或者一些具有相同功能的特定于 C# 的习语吗?

澄清:我想让它只对List全班可见。我已经知道internal关键字。

0 投票
2 回答
1051 浏览

c - 我是否正确假设不能前向声明库的不透明指针类型?

关于前向声明和不透明类型有很多问题,但大多数似乎是从库作者的角度来看的,或者人们试图使用没有指针的不完整类型等。

我正在使用一个接口接受/返回FOO *指针的库。我想确认我不能(或不应该)以某种方式向前声明FOOFOO *在我的头文件(它定义了一个带有FOO *成员的结构)中。

我确实知道我可以#include <library.h>在我的头文件和我的 .c 文件中,但由于这实际上只是一个学习项目,我想得到澄清。(一方面,前向声明似乎是可能的,因为我的结构成员只是一个指针,因此它的大小在不知道是什么的情况下是已知FOO的——但另一方面,我不知道它是否有效/smart 到图书馆已经在这样做的时候。typedefFOO

提前致谢!

0 投票
2 回答
8244 浏览

c - C - 头文件中的结构定义

我有他们的头文件附带的这两个结构。

我的结构编号 1 是:

头文件'list.h':

源文件“list.c”:

我的结构号 2 是:

头文件“bal.h”:

源文件“bal.c”:

当我尝试在我的 bal.c 文件中使用一个函数时,例如:

我在这一行遇到错误:search = strchr(name->value, toFind); 说:错误:取消引用指向不完整类型的指针

我不知道为什么因为我已经在我的 bal.c 中包含了 list.h

我在 Stackoverflow 上读过很多书,说这种类型的程序被称为:不透明类型,这似乎非常好,但我不知道如何将我的其他头文件用于其他源文件。我认为我所要做的就是将我的 list.h 包含在我的 bal.c 文件中。

我正在用这个 commamd 在 gcc 中编译:gcc -g -W -Wall -c bal.c bal.h

非常感谢你 !

0 投票
1 回答
97 浏览

c - 第一次使用不透明指针

我正在尝试实现一个堆栈,但不了解不透明指针的使用。这里是我的报关表:

这是我的堆栈结构和 new_stack 函数:

在我看来,我正在返回新堆栈的地址,但这会在返回新堆栈时引发编译错误。我究竟做错了什么?

0 投票
3 回答
1194 浏览

c - 可在 C 中的堆栈上分配的不透明类型

在设计 C 接口时,通常只让.h用户程序知道的内容进入公共接口 ( )。

因此,例如,如果用户程序不需要知道结构的内部组件,则它们应该保持隐藏。这确实是一种很好的做法,因为结构的内容和行为将来可能会发生变化,而不会影响界面。

实现该目标的一个好方法是使用不完整类型。

typedef struct foo opaqueType;

现在可以构建一个只使用指针的接口opaqueType,而用户程序不需要知道struct foo.

但有时,可能需要静态分配此类结构,通常在堆栈上,以解决性能和内存碎片问题。显然,上面的构造,opaqueType是不完整的,所以它的大小是未知的,所以它不能被静态分配。

一种解决方法是分配“外壳类型”,例如:

typedef struct { int faketable[8]; } opaqueType;

上面的构造强制了大小和对齐,但没有进一步描述结构真正包含的内容。所以它符合保持类型“不透明”的目标。

它主要工作。但在一种情况下(GCC 4.4),编译器抱怨它破坏了严格的别名,并生成了错误的二进制文件。

现在,我已经阅读了大量关于严格别名的内容,所以我想我现在明白它的含义了。

问题是:有没有办法定义一个不透明的类型,它仍然可以在堆栈上分配,并且不违反严格的别名规则?

请注意,我已经尝试过这篇优秀文章中描述的联合方法,但它仍然会产生相同的警告。

另请注意,视觉、clang 和 gcc 4.6 及更高版本不会抱怨并且可以正常使用此构造。

[编辑]信息补充:

根据测试,该问题仅在以下情况下发生:

  • 私有和公共类型不同。我在.c文件中将公共类型转换为私有。他们是否属于同一个工会显然并不重要。公共类型是否包含char.
  • 如果私有类型的所有操作都只是读取,那没有问题。只有写入会导致问题。
  • 我还怀疑只有自动内联的函数才会遇到麻烦。
  • 问题仅发生在 gcc 4.4 的 -O3 设置上。-O2 很好。

最后,我的目标是C90。如果真的别无选择,也许是C99。

0 投票
2 回答
3467 浏览

c - 如何删除链表中的头节点?C

所以我有一个链表堆栈作为 C 中的一个不透明对象。我将一个头指针指针传递给该函数。

这是删除头功能的代码。我叫它流行音乐

这不起作用。它不会删除头节点。我其实可以。但是当我这样做时,头节点不会切换到下一个,并且程序崩溃了,因为没有头大声笑。我如何将头部切换到下一个。因为它不工作。这是一个节点指针指针。它是 Node 的公共版本,称为MY_STACK. 我不知道您对不透明对象有多熟悉,但为此需要这样做。我不能只是把所有东西放在一起我知道如何用它来做头部删除但在这里它不起作用

这是 MY_STACK 头文件。Node_ptr 是私有版本,它包含相同的内容 + 数据和下一个字段。我必须将 MY_sTACK 转换为 Node_ptr 才能访问这些东西。

我有一个有效的插入功能。它改变了头部。但由于某种原因,pop 功能不这样做

0 投票
1 回答
241 浏览

c - 向不透明句柄添加 const-ness

如果我创建了一个 C 模块,它通过指向前向声明结构的指针向用户提供句柄,如下所示:

如果我随后声明将其用作const限定参数的函数原型:

-ness是如何const应用的?

还是UB

0 投票
1 回答
49 浏览

ios - 核心图形不透明类型,它们是什么以及如何?

我正在学习核心图形,特别是学习 CGContextRef。我的问题是关于不透明数据类型的语法和实现细节(如果它们是已知的)。我知道诸如 CGContextRef 之类的不透明类型是对内存中某些底层结构的引用(指针?),并且它是不透明的,因为该结构的细节对开发人员是隐藏的。

因此,如果我有一个这样声明的变量:CGContextRef context = UIGraphicsGetCurrentContext();为什么上下文不需要在它之前使用“*”来表示这是一个引用类型/指针?这种句法奇点的语义意义是什么?

0 投票
1 回答
1116 浏览

c++ - 是否可以通过模板参数的条件排除模板成员变量?

我目前正在编写一个应该根据模板参数专门化的类。

我现在想知道是否可以根据数字模板参数是否大于 X 来更精确地省略特定专业化的某些成员变量。

例如:

我正在考虑使用 std::conditional ,但这似乎导致至少选择一种类型。我当然可以使用 D-Pointer 方法和 std::conditional 并将特化放入指向的不同对象中,但我想知道是否有更好的方法。

我看到的另一种选择是使用抽象基类并有两个实现,一个用于 N < X,一个用于 N >= X,但我不确定这会更好。