C语言 在sizeof()中对指针类型解引用



我有以下结构:

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 {
    ...
};

相关内容

  • 没有找到相关文章

最新更新