C:只将结构初始化为指针?

时间:2013-12-01 04:25:36

标签: c struct

有没有办法确保创建时的struct对象始终是指针?

例如:

typedef struct
{
  int foo;
} blah;

blah a; // error
blah* b; // ok

2 个答案:

答案 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;

它自动成为指针。