我有以下结构:
typedef struct _foo_t {
int bar;
float buzz;
char quux[40];
} *const foo_t;
是否有一种方法可以获得结构的大小,就像通过sizeof(struct _foo_t)
一样,但只使用名称foo_t
?我已经尝试过sizeof(*foo_t)
,但不编译。
我不相信你能直接做到这一点。如果您想这样做,则需要定义一个中间类型定义:
typedef struct _foo_t {
int bar;
float buzz;
char quux[40];
} foo_t;
typedef foo_t *const foo_tp;
// sizeof(foo_t) should work
解引用类型在c语言中并没有真正意义。你可以解引用变量,但不能解引用类型。在c++中,您可以使用模板执行这些类型操作,但这并不真正适用,因为您指示了C标记。
您还可以声明一个适当类型的虚拟变量,以便在表达式上调用sizeof
:
foo_tp f;
// sizeof(*f) should work
您可以使用像这样的复合文字来实现这一点:
sizeof(*(foo_t){NULL})
foo_t
是一个typedef
,所以它就像一个类型。
*foo_t
不是一个有效的表达式,因为不能对类型解引用。
因为它不是一个有效的表达式,你不能得到它的大小。
如:
typedef int * pointer_to_int_type;
size_t a = sizeof(*pointer_to_int_type);
不能将类型名用作操作数(不仅仅是sizeof),因为表达式需要具有类型(在C中,类型不像在Python等全oo语言中那样是第一类公民)。然而,当使用括号版本- C11草案6.5.3.4#1/2时,您可以单独使用类型名。一个可以理解的限制。
请注意,在sizeof
关键字后面的括号中的表达式将具有不同的语法语义:括号是表达式的一部分,而对于类型名,它们是sizeof
操作符的一部分(其工作方式类似于函数调用)。(我真的不热衷于为C编写解析器。)
我自己通常不做typedef
指针。这隐藏了语义,并支持忘记它们有些特殊(和危险)的属性。异常是外部接口,其中指针在外部更像句柄而不是指针。但我实际上只在外膜上使用。
好的,正如我从讨论中得到的,你正在尝试使用不透明的指针。但是,无论如何,通过同时定义结构类型和指针,这将无法工作。你需要拆分它:
"hidden_stuff.h":
typedef struct HiddenStruct * const HiddenStructHandle;
"hidden_stuff.c"
#include "hidden_stuff.h"
struct HiddenStruct {
...
};