размер массива зависит от sizeof () структурного поля - PullRequest
0 голосов
/ 29 ноября 2010

У меня есть глобальный включаемый файл, который содержит набор структур.Где-то в моей программе у меня есть класс, который содержит массив членов.Количество элементов в этом массиве зависит от размера определенного поля в определенной структуре.Я хочу сделать так, чтобы размер массива автоматически обновлялся при изменении размера поля структуры.Я смог сделать это успешно с помощью следующего выражения:

bool shadowChkBox[sizeof(FSCconfigType::WriteEn)*8*MAX_FSCS];

FSCconfigType является типом структуры, а WriteEn является одним из полей.Теперь это работает, но только на Ubuntu.На RHEL 5 компилятор объявил это как ошибку.Какие еще есть альтернативы для этого?Я работаю с Qt.

Ответы [ 3 ]

2 голосов
/ 29 ноября 2010

Вот один из возможных ответов:

#include <iostream>

struct A
{
        int a;
        int b;
        int c;
};

bool items[sizeof(reinterpret_cast<A *>(0)->b)];

int main()
{
        std::cout << sizeof(reinterpret_cast<A *>(0)->b) << ",";
        std::cout << sizeof(items) << std::endl;
        return 0;
}
0 голосов
/ 16 июля 2014
#include <iostream>

struct C
{
    int iv;
    void* pv;
    char buf[128];
};

template< typename TObj, typename TFieldType >
std::size_t field_size( TFieldType (TObj::*) )
{
    return sizeof(TFieldType);
}

int main() {

    std::cout << field_size(&C::iv) << std::endl;
    std::cout << field_size(&C::pv) << std::endl;
    std::cout << field_size(&C::buf) << std::endl;
}
0 голосов
/ 29 ноября 2010

Один хрупкий ответ - взять разницу значений offsetof для WriteEn и следующего поля (или, если это не так, размер всей структуры).

Это может дать немного больший ответ, чем sizeofк выравниванию на основе выравнивания.

Еще большая проблема - это то, что происходит, если вы переставляете свои поля, не исправляя это, но это может быть вариантом, если вы в отчаянии.

...