Подтвердить что ты не робот

Могу ли я получить размер поля структуры без создания экземпляра структуры?

Это тривиально, чтобы получить размер поля структуры в С++, если у вас есть экземпляр структуры. Например. (Неоткомпилированные):

typedef struct Foo {
    int bar;
    bool baz;
} Foo;

// ...

Foo s;
StoreInSomething(s.bar, sizeof(s.bar)); // easy as pie

Теперь я все еще могу сделать что-то подобное, но с интерфейсом, который я реализую (я получаю BOOL, который указывает, что должно быть состояние определенного бита в битовом поле), я бы создал структуру исключительно для получить размер элемента данных. Есть ли способ указать компилятору, что он должен использовать размер поля структуры без создания экземпляра структуры? Это был бы философский эквивалент:

SetBit(bool val) {
    StoreInSomething(
        BITFIELD_POSITION_CONSTANT, // position of bit being set
        val,                        // true = 1, false = 0
        sizeof(Foo::bar));          // This is, of course, illegal.  (The method I've been told I must use req the size of the target field.)
}

Создание структуры в стеке должно быть быстрым и дешевым, но я подозреваю, что в обзоре кода я буду одет в него, поэтому я ищу лучший способ, который не вводит дополнительную нагрузку на обслуживание (например, #defines для размеров).

4b9b3361

Ответ 1

Вы можете использовать выражение, например:

sizeof Foo().bar

Поскольку аргумент sizeof не оценивается, на самом деле создается только его тип, не временный.

Edit

Если Foo не был по умолчанию конструктивным (в отличие от вашего примера), вам нужно будет использовать другое выражение, например, включающее указатель. (Спасибо Майку Сеймуру)

sizeof ((Foo*)0)->bar

Ответ 2

typedef struct Foo { 
    typedef BarType int;
    BarType bar; 
    bool baz; 
} Foo;

...

sizeof(Foo::BarType)

Ответ 3

Вы можете использовать sizeof с указателем на структуру. Рассмотрим следующее:

#include <stdio.h>

typedef struct Foo {
    char         cbar;
    short        sbar;
    int          bar;
    bool         baz;
    long long    llbar;
} Foo;




int main (void)
{
    struct Foo    *p_foo = 0;

    printf("Size of cbar: %d\n", sizeof(p_foo->cbar));
    printf("Size of sbar: %d\n", sizeof(p_foo->sbar));
    printf("Size of bar: %d\n", sizeof(p_foo->bar));
    printf("Size of baz: %d\n", sizeof(p_foo->baz));
    printf("Size of llbar: %d\n", sizeof(p_foo->llbar));
}

Что дает такие результаты, как:

163> size.exe
Size of cbar: 1
Size of sbar: 2
Size of bar: 4
Size of baz: 1
Size of llbar: 8