C:是否仅将结构初始化为指针?

C:是否仅将结构初始化为指针?,c,struct,C,Struct,有没有办法确保结构对象在创建时始终是指针 例: 当然-您只需将struct的定义隐藏到它自己的翻译单元中,以防窥探。然后,在其他地方(以及更公开的地方),只需向前声明结构: typedef struct x blah; blah在本例中是一个不完整的类型,因此任何只访问该声明的人只能创建blah*对象,而不能创建完整的blah对象 另一个选项是更改typedef: typedef struct { int foo; } *blah; 现在,blah本质上是指针类型,任何声明: bla

有没有办法确保结构对象在创建时始终是指针

例:


当然-您只需将
struct
的定义隐藏到它自己的翻译单元中,以防窥探。然后,在其他地方(以及更公开的地方),只需向前声明结构:

typedef struct x blah;
blah
在本例中是一个不完整的类型,因此任何只访问该声明的人只能创建
blah*
对象,而不能创建完整的
blah
对象

另一个选项是更改typedef:

typedef struct
{
    int foo;
} *blah;
现在,
blah
本质上是指针类型,任何声明:

blah b;

实际上只是创建一个指针。由于Stult本身是匿名的,除了指针只有“代码> TyPulf之外,没有其他方法创建。

苹果在其核心基础框架中使用了很多语法。它们大量使用

CF_____;Ref
对象,如下所示:

struct __CFArray {
    // Internal Structure
};

// Copied from CFArray.h
typedef const struct __CFArray * CFArrayRef;
CFArrayRef myArray;
因此,如果您编写这样的代码:

struct __CFArray {
    // Internal Structure
};

// Copied from CFArray.h
typedef const struct __CFArray * CFArrayRef;
CFArrayRef myArray;

它自动成为一个指针。

结构从来都不是指针。结构就是结构。指向结构的指针就是指针。如果您曾经让
b
指向此代码中的某个内容,
*b
将需要是
blah
而不是指向
blah
的指针。您实际上想要实现什么?为什么要禁止
之类的声明?您是否试图确保仅通过提供的接口创建
blah
对象?我怀疑您试图阻止在堆栈上分配结构。你能确认这是你的意图吗?我希望我的结构实例只能通过一个返回ptr的函数来创建,因此为了紧凑起见,不允许堆栈上的实例是有帮助的。+1不完整类型是OP问题的确切解决方案。