Вот правильное решение, и автор уверяет что макрос считается на этапе компиляции, но я
чего-то сомневаюсь. Поэтому поддерживаю "да только нафига такое.."
// #include <stdio.h> #define bitoffsetof(t, f) \ ({ union { unsigned long long raw; t typ; }; \ raw = 0; ++typ.f; __builtin_ctzll(raw); }) #define bitsizeof(t, f) \ ({ union { unsigned long long raw; t typ; }; \ raw = 0; --typ.f; 8*sizeof(raw)-__builtin_clzll(raw)\ -__builtin_ctzll(raw); }) struct RGB565 { unsigned short r:5, g:6, b:5; }; int main() { printf("offset(width): r=%d(%d) g=%d(%d) b=%d(%d)\n", bitoffsetof(RGB565, r), bitsizeof(RGB565, r), bitoffsetof(RGB565, g), bitsizeof(RGB565, g), bitoffsetof(RGB565, b), bitsizeof(RGB565, b)); } //
Только я не понял где брать __builtin_clzll()
https://stackoverflow.com/questions/3319717/is-there-a-bit-equivalent-of-sizeof-in-c