C:做sizeof的更好方法(((SomeStruct*)0) - > some_member)?

yai*_*chu 1 c ffi

我想获得结构中特定成员的大小.

sizeof(((SomeStruct *) 0)->some_member) 适合我,但我觉得可能有更好的方法来做到这一点.

我可以#define SIZEOF_ELEM(STRUCT, ELEM) sizeof(((STRUCT *) 0)->ELEM)然后使用SIZEOF_ELEM(SomeStruct, some_member),但我想知道是否已经有更好的内置功能.

我的具体用例是hsc2hs(Haskell C绑定).

pokeArray (plusPtr context (#offset AVFormatContext, filename)) .
  take (#size ((AVFormatContext *) 0)->filename) .
  (++ repeat '\NUL') $ filename
Run Code Online (Sandbox Code Playgroud)

Jon*_*ler 5

如果你不能保证你有一个变量来解除引用,那么你得到的就是干净利落.(如果可以,那么使用just sizeof(var.member)或者sizeof(ptr->member)当然,但是在需要编译时常量的某些上下文中这不起作用.)

很久很久以前(大约1990年),我遇到了一个offsetof使用基地址0定义的编译器,它崩溃了.我通过黑客攻击<stddef.h>使用1024而不是0来解决这个问题.但是你现在不应该遇到这样的问题.