问题标签 [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 - 将不透明的结构定义放入单独的头文件中
我正在设计一个包含不透明结构声明的公共接口的库:
lib_public.h
:
opaque 结构隐藏了特定于lib_struct
操作系统的实现细节,因此将其直接放入似乎是一个糟糕的设计lib_struct.h
。但我仍然想为它编写使用其成员的单元测试。目前我决定创建一个单独的私有头文件,其中只包含结构定义:
lib_struct_linux.h
:
因此,实现lib_struct.c
和单元测试lib_struct_test.c
将包含此标头,如下所示:
lib_struct.c
:
lib_struct_test.c
:
lib_struct_linux.h
从结构定义在一个私有头文件 ( ) 中,使用该结构的函数在另一个公共头文件 ( lib_public.h
)中声明的意义上,这样的设计看起来很混乱。以及在另一个实现文件 ( lib_struct.c
) 中的函数定义。
这是常见的方法吗?如果不是,如何以更好的方式设计它。
c - 如何在多个 .c 文件中包含不透明类型?
我应该根据头文件和一些进一步的描述来制作一个程序。需要使用不透明类型的问题。不透明结构在头文件中与其他一些函数一起声明。但是每个函数都应该有自己的 .c 文件,问题就来了。我应该做什么或应该在哪里定义不透明结构,以便我的函数可以使用它?
我有如下文件:
header.h source.c(main) function1.c fuction2.c 等
在这种情况下,我不知道该怎么做。
c - 迭代器提供其当前元素的“视图”
我目前正在解决的设计问题是迭代某个内存区域,并在每次这样的迭代中从该内存中检索客户感兴趣的一些元数据。我目前看到 2 个解决方案:
一世。
所以队列不透明结构可以通过next
函数遍历,因为队列元素是平台相关的,我想保持库跨平台,我提供了一个平台无关struct queue_element_view
的,在所有平台上都是明智的。
退税:
如果客户端编写这样的代码:
所以调用next
后调用current_element_view
clobbers current_out
。
二、
在这种情况下,我们已将数据分配struct queue_element_view
并current_element_view
复制到 struct 指向的对象,queue_element_view *
因此 next 不会破坏数据。
缺点:
它涉及一个函数附加调用来简单地检索
int
和char *
字段它使测试公共 api 更加复杂。
所以我有点困惑哪一个更可取/可读?可能还有另一种选择?
c++ - 如何用向量将 C++ 函数包装在 C 中输出参数?
我正在编写一个 C 包装器,需要从结构向量中获取数据。
要包装的结构和函数
我在 C 中重新定义了 foo 结构,但如果我应该使用 opca 类型作为句柄,则可能没有必要。标头包装器.h
包装器.cpp
主程序
使用此代码,main.c
当我读取 foo_wrapper 指针时,我会遇到运行时指针错误。
munmap_chunk(): invalid pointer
c++ - 何时在 C++ 中的嵌套类上使用 Pimpl 模式,反之亦然?
在 C++ 中,大多数开发人员使用pimpl idiom或opaque 指针来隐藏公共 API 的私有数据/实现,例如:
- =>第一种情况 ## 不透明指针和 PIMPL 成语 ##
// 在头文件中
// 类 Node 将在各自的 cpp 中定义
2.=>第二种情况##内部类/嵌套类方法##
// 在头文件中
问题是...
- 从类设计的角度来看,这两者之间的实际区别是什么(可能是设计模式)?
- 每个人的优点和缺点是什么?
c - 为什么我不能创建不透明的数据类型?
我正在尝试使用不透明的数据类型来了解它们。主要问题是我不断收到“不完整”错误。
主程序
fnarpishnoop.c
blepz.h
我显然不明白这里的某些东西,我希望有人可以帮助我弄清楚不透明数据类型是如何实现的,如果它们的全部意义在于你很难找到它们的实际代码。
c - 如何使用结构声明
我想隐藏结构定义,所以我在源文件中定义结构,如下所示:
我在头文件中声明结构,如下所示:
然后我使用 struct a_t
int main.c 文件,如下所示:
但是当我编译 main.c 时gcc -c main.c
,它失败了
为什么会失败?
c - C 结构信息隐藏(不透明指针)
我目前对 C 结构信息隐藏的概念有点困惑。
这个问题的背景是一个嵌入式c项目,OOP知识几乎为零。
到目前为止,我总是在相应模块的头文件中声明我的 typedef 结构。所以每个想要使用这个结构的模块都知道结构类型。
但在 MISRA-C 检查后,我发现了中等严重性警告:MISRAC2012-Dir-4.8 - 结构的实现不必要地暴露给翻译单元。
经过一番研究,我通过将结构成员的可见访问限制在私有范围内,发现了 C 结构信息隐藏的概念。
我立即尝试了一个简单的示例,如下所示:
struct_test.h
struct_test.c
主程序
这会产生编译器错误,对于 main.c,myTest 的大小是未知的。当然它是,main.c 只知道 structType_t 类型的结构存在,没有别的。
所以我继续我的研究并偶然发现了不透明指针的概念。
所以我尝试了第二次尝试:
struct_test.h
struct_test.c
主程序
我得到编译器错误:取消引用指向不完整类型的指针struct _structName
所以很明显我还没有理解这种技术的基本概念。我的主要困惑是结构对象的数据将在哪里?
到目前为止,我的理解是指针通常指向数据类型的“物理”表示,并在相应地址上读取/写入内容。
但是使用上面的方法,我声明了一个指针 myTest 但从未设置它应该指向的地址。
我从这篇文章中得到了这个想法: 什么是 C 中的不透明指针?
在帖子中提到,访问是使用 set/get 接口方法处理的,所以我尝试添加一个类似的方法:
但这也不起作用,因为现在他告诉我这_structName
是未知的......所以我只能在其他接口方法的帮助下访问结构吗?如果可以,我如何在我的简单示例中实现这一点?
我更大的问题仍然是我的结构对象在内存中的位置。我只知道指针概念:
varA - 地址:10 - 值:1
ptrA - 地址:22 - 值:10
但在这个例子中我只有
myTest - 地址:xy - 值:??
我无法理解相应myTest
指针的“物理”表示在哪里?
此外,在我是模块的生产者和消费者的相对较小范围的嵌入式项目中,我看不到这样做的好处。
有人可以解释一下这种方法对于 1-2 名开发人员使用代码的中小型嵌入式项目是否真的合理?目前,制作所有这些接口指针方法似乎比仅仅在我的头文件中声明结构更努力。
先感谢您
c - 关于不透明指针,链接在 C 中如何工作?
因此,我对各种事物的链接有些困惑。对于这个问题,我将专注于不透明的指针。
我将用一个例子来说明我的困惑。假设我有这三个文件:
主程序
对象.c
对象.h
由于预处理器指令,它们本质上将成为两个文件:
(我知道从技术上讲 stdio.h 和 stdlib.h 会让他们的代码替换预处理器指令,但为了可读性我没有费心去替换它们)
主程序
对象.c
现在这里是我有点困惑的地方。如果我尝试在 main.c 中创建一个 struct obj,我会收到一个不完整的类型错误,即使 main.c 有声明struct obj;
。
即使我将代码更改为 use extern
,它仍然无法编译:
主程序
对象.c
据我所知,main.c 和 obj.c 不通信结构(与某些只需要在另一个文件中声明的函数或变量不同)。
因此,main.c 与 struct obj 类型没有链接,但出于某种原因,在前面的示例中,它能够创建一个指向 one 的指针就好了struct obj *myobj;
。怎么,为什么?我觉得我错过了一些重要的信息。关于什么可以或不可以从一个 .c 文件转到另一个的规则是什么?
附录
为了解决可能的重复,我必须强调,我不是在问什么是不透明指针,而是它在文件链接方面的作用。