ВходНаше всё Теги codebook 无线电组件 Поиск Опросы Закон Суббота
5 июля
1527603 Топик полностью
IBAH (01.07.2025 15:09, просмотров: 78) ответил POV на да только нафига такое..
Вот правильное решение, и автор уверяет что макрос считается на этапе компиляции, но я чего-то сомневаюсь. Поэтому поддерживаю "да только нафига такое.." 
//
#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