2010-11-28 53 views
0

我有一个包含一组结构的全局包含文件。在我的程序中,我有一个包含成员数组的类。此数组中元素的数量取决于特定结构中特定字段的大小。我想要这样做,以便如果结构字段的大小发生更改,数组大小将自动更新。我已经能够用以下表达式成功完成此操作:数组大小依赖于sizeof()结构字段

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