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;
实际上只是创建一个指针。由于
苹果在其核心基础框架中使用了很多语法。它们大量使用
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问题的确切解决方案。