有没有办法确保创建时的struct对象始终是指针?
例如:
typedef struct
{
int foo;
} blah;
blah a; // error
blah* b; // ok
答案 0 :(得分:8)
当然 - 你只需要将struct
的定义隐藏在自己的翻译单元中,远离窥探的眼睛。然后,在其他地方(以及更多公共场所),只需向前声明结构:
typedef struct x blah;
在这种情况下, blah
是不完整类型,因此任何只能访问该声明的人只能创建blah *
个对象,而不是blah
对象。
另一个选择是更改你的typedef:
typedef struct
{
int foo;
} *blah;
现在,blah
本质上是一个指针类型,以及任何声明:
blah b;
实际上只创建一个指针。由于struct
本身是匿名的,除了通过仅指针typedef
之外,无法创建一个。{/ p>
答案 1 :(得分:0)
Apple在其Core Foundation框架中使用了这种语法。他们大量使用CF____Ref
个对象,如下所示:
struct __CFArray {
// Internal Structure
};
// Copied from CFArray.h
typedef const struct __CFArray * CFArrayRef;
因此,如果你编写这样的代码:
CFArrayRef myArray;
它自动成为指针。