2010-11-28 13 views
0

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

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

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

+2

Что ошибка вы получаете на RH? – 2010-11-28 21:48:49

+4

Я подозреваю, что это больше связано с той версией GCC, которую вы используете, а не с какой версией Linux. – xscott 2010-11-28 21:50:00

+0

Можете ли вы использовать тип поля напрямую, а не ссылаться на него через поле? Я предполагаю, что нет (потому что это причина, почему sizeof может измениться), но это не мешает проверить. – Steve314 2010-11-28 21:56:07

ответ

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; 
} 
0

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

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

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

0
#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; 
} 
Смежные вопросы