alignof(type, field); sizeof(type, field); typeof(type, field): getting type information on nested field
Jonathan Wakely
jwakely.gcc@gmail.com
Tue Jul 2 08:32:00 GMT 2019
On Tue, 2 Jul 2019 at 08:57, Yann Droneaud <ydroneaud@opteya.com> wrote:
>
> Hi,
>
> I'm sometime in need to "probe" the size, the type, (and less often the
> alignment) of a field inside a structure.
>
> In such case I have to write "ugly" thing like
>
> struct A
> {
> struct
> {
> type_t t;
> } B;
> };
>
> typeof(((struct A *)NULL)->B.t) V;
>
> It would have been some much pleasing to have 2 parameters version of
> sizeof(), typeof(), and alignof(), which would look like a lot like
> offsetof() usage:
>
> typeof(struct A, B.t) V;
>
> if (sizeof(struct A, B.t) != sizeof(long)) ... ;
>
> if (alignof(struct A, B.t) < alignof(long)) ... ;
>
> As sizeof is an operator, this is not straightforward to implement.
>
> Currently sizeof (0, variable); is a valid construct, giving the size
> of "variable".
>
> Hence, turning sizeof() to a variadic function-like thing would break
> existing code.
>
> Maybe it would possible to add such function-like operator as _Sizeof()
> ? And have a header #define'ing sizeof(...) as _Sizeof() for code
> wanting the new behavior ?
That seems like a terrible idea.
> Is this possible ? Is such feature was already considered ?
#define SIZEOF_MEM(type, member) sizeof(((type*)0).member)
#define TYPEOF_MEM(type, member) __typeof__(((type*)0).member)
#define ALIGNOF_MEM(type, member) _Alignof(((type*)0).member)
More information about the Gcc
mailing list