c idiom的名字 - `static void * thing =& thing;`

时间:2015-03-11 09:49:09

标签: c

代码:

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);

有什么想法吗?

3 个答案:

答案 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一样,没有必要让它成为解决这个问题的习惯用语,最后 - 这里没有成语。