不透明的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;