不透明的C结构:他们应该如何申报?

我已经看到了以下两种在C API中声明不透明types的风格。 使用另一种风格有没有明显的优势?

选项1

// foo.h typedef struct foo * fooRef; void doStuff(fooRef f); // foo.c struct foo { int x; int y; }; 

选项2

 // foo.h typedef struct _foo foo; void doStuff(foo *f); // foo.c struct _foo { int x; int y; }; 

我的投票是mouviciel发布的第三个选项,然后删除:

我看到了第三种方式:

 // foo.h struct foo; void doStuff(struct foo *f); // foo.c struct foo { int x; int y; }; 

如果你真的无法忍受inputstruct关键字, typedef struct foo foo; (注:摆脱无用和有问题的下划线)是可以接受的。 但是不pipe你做什么,都不要使用typedef来为指针types定义名字。 它隐藏了极其重要的一条信息,即这种types的variables引用了一个对象,只要你将它传递给函数就可以被修改,而且它使得指针的不同限定的版本(例如, const限定的) 。

bar(const fooRef)声明一个不可变的地址作为参数。 bar(const foo *)声明一个不可变的foo的地址作为参数。

出于这个原因,我倾向于select2.也就是说,所提出的接口types是可以在每个间接级别指定cv-ness的接口types。 当然,人们可以避开select1图书馆作家,只是使用foo ,当图书馆作者改变实现时,打开自己的各种恐怖。 (也就是说,选项1库作者只知道fooRef是不变接口的一部分, foo可以来,去,被改变,而选项2库作者则认为foo是不变接口的一部分。

我更惊讶没有人build议组合typedef /结构的结构。
typedef struct { ... } foo;

Interesting Posts