我有以下结构:
typedef struct _foo_t {
int bar;
float buzz;
char quux[40];
} *const foo_t;
有没有办法获得结构的大小,就像通过sizeof(struct _foo_t)
完成,但只使用名称foo_t
?我试过了sizeof(*foo_t)
,但是没有编译。
答案 0 :(得分:6)
我不相信你可以直接这样做。如果要执行此操作,则需要定义中间typedef:
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
答案 1 :(得分:3)
您可以使用这样的复合文字来完成此操作:
sizeof(*(foo_t){NULL})
答案 2 :(得分:1)
foo_t
是typedef
,因此它就像一个类型。
*foo_t
不是有效表达式,因为您无法取消引用某个类型。
由于它不是有效的表达式,因此无法获得其大小。
这是写作:
typedef int * pointer_to_int_type;
size_t a = sizeof(*pointer_to_int_type);
答案 3 :(得分:0)
你不能使用类型名作为操作数(不仅仅是对于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 {
...
};
在头文件中包含结构将破坏封装/隐藏。