размер массива зависит от sizeof() поля структуры

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

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

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


person yan bellavance    schedule 28.11.2010    source источник
comment
Какую ошибку вы получаете на RH?   -  person Eldad Mor    schedule 29.11.2010
comment
Я подозреваю, что это больше связано с используемой версией GCC, а не с версией Linux.   -  person xscott    schedule 29.11.2010
comment
Можно ли использовать тип поля напрямую, а не ссылаться на него через поле? Я предполагаю, что нет (потому что это причина, по которой sizeof может измениться), но проверить не помешает.   -  person Steve314    schedule 29.11.2010
comment
@steve на самом деле это причина, по которой sizeof может измениться   -  person yan bellavance    schedule 29.11.2010
comment
@xscott Я также подозреваю, что виновата версия gcc. Я не знаю, возможно ли/хорошо ли обновление gcc при развертывании для RHEL.   -  person yan bellavance    schedule 29.11.2010
comment
@yan bellavance, я согласен, что вы не должны требовать от своих пользователей обновления gcc. Я просто пытался прояснить проблему. Я думаю, что код должен скомпилироваться, и если это ошибка в старой версии gcc, то я думаю, что вы застрянете с более уродливым обходным путем.   -  person xscott    schedule 29.11.2010
comment
@xscott спасибо за ваш вклад   -  person yan bellavance    schedule 29.11.2010
comment
@Eldad Mor ошибка, которую мне выдает qt: ошибка: недопустимое использование нестатического члена данных ‘FSCconfigType::WriteEn   -  person yan bellavance    schedule 29.11.2010


Ответы (2)


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

#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;
}
person clstrfsck    schedule 28.11.2010
comment
спасибо, это сработало. Однако один вопрос. что именно вы делаете с (0)? Кажется, это нулевой адрес. - person yan bellavance; 29.11.2010
comment
Аргумент sizeof не оценивается, кроме как для определения его типа. Преобразование NULL в A * является таким же хорошим способом, как и любой другой способ получить что-то, что имеет тип указателя на A. (Например, ( A*)printf(0) тоже подойдет.) - person ; 29.11.2010

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

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

Более серьезная проблема заключается в том, что произойдет, если вы переупорядочите свои поля, не исправив это, но это может быть вариантом, если вы в отчаянии.

person Steve314    schedule 28.11.2010