簡體   English   中英

在sizeof()中取消引用指針類型

[英]Dereferencing pointer type when in 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:

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

在頭文件中使用結構將破壞封裝/隱藏。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM