代码:
static const void *const uniquePtr = &uniquePtr;
...将在编译单元中提供唯一的void
指针。通过这种方式为void*
命名的API生成唯一句柄或名称非常方便。
使用示例:
将这个模式包装在一个宏中是明智的,以避免犯错误,并将这个想法封装起来以便自我记录。
但是这导致了一个问题:这个成语的名称可以用来命名宏吗?:
#define DECLARE_VOID_THING(name) static const void *const name = &name
DECLARE_VOID_THING(aHandle);
DECLARE_VOID_THING(anotherHandle);
有什么想法吗?
答案 0 :(得分:1)
我称之为self reference
与
struct self {
struct self *moi;
} me = { &me};
这样做的另一个好处是,您不必取消引用void*
指针才能使用它。 (例如:assert (me.moi == &me);
)
答案 1 :(得分:1)
正如上面所说的那样(很可能)没有标准用语,所以你可以自由选择你认为最好的东西。也许像UNIQUE_VOID_POINTER
或类似的东西。
答案 2 :(得分:0)
编程习语是表达重复结构的一种方法 一种或多种编程语言。
这是一种构造,经常反复出现以证明自己是"自己的东西&#34 ;?根据定义,它是否有资格成为一个成语?
即使问题被标记为C
,在一些API中看起来似乎纯粹是一个Objective-C的东西,语言和特定的API都不是示例性的。它的目的很简单,就是提供一个独特的任意值,当你不关心关键值时,这是一种懒惰的枚举形式。这应该是一个成语吗?
我认为不是,这不是我个人的偏好,而是简单的逻辑。它是罕见且无关紧要的,基本上它是内存中的值恰好等于它在内存中的地址。它应该拥有自己的名称作为数组中的整数,其值等于数组中的索引。
此外,没有任何标准名称,这个问题自动变成一个主要基于意见的"一,这是违反SO指导原则,首先是与编程问题无关。它不是一个特定的编程问题",它不是一个实用的,可回答的问题,这是软件开发所特有的问题。由于没有自己的名字对其使用没有任何问题,因此它是程序员讨论板中讨论的主题。它在SO上有一个地方和一个问题" 我应该如何命名我的变量?"而且我并不是指编码惯例,最终,问题是关于什么,如何命名宏......以及与其使用意图至少含糊不清的几乎任何东西都将超过{{1}就像说DECLARE_VOID_THING
一样,没有必要让它成为解决这个问题的习惯用语,最后 - 这里没有成语。