数组大小取决于sizeof()一个struct字段

时间:2010-11-28 21:46:08

标签: c++ gcc data-structures ubuntu redhat

我有一个包含一组结构的全局包含文件。在我的程序的某个地方,我有一个包含成员数组的类。此数组中的元素数取决于特定结构中特定字段的大小。我想这样做,以便在结构字段的大小改变时,数组大小将自动更新。我已经能够使用以下表达式成功完成此任务:

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

FSCconfigType是结构类型,WriteEn是其中一个字段。现在这个有效,但只适用于ubuntu。在RHEL 5上,编译器将其声明为错误。这样做还有什么其他选择?我正在使用Qt。

3 个答案:

答案 0 :(得分: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;
}

答案 1 :(得分:0)

一个脆弱的答案是将WriteEn和下一个字段的offsetof值的差异取消(或者使整个struct的大小失败)。

由于基于对齐的填充,这可能会给出比sizeof稍大的答案。

更大的问题是,如果你重新安排你的领域而不解决这个问题会发生什么 - 但如果你绝望的话,这可能是一个选择。

答案 2 :(得分: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;
}