Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/126.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 数组大小取决于sizeof()结构字段_C++_Gcc_Data Structures_Ubuntu_Redhat - Fatal编程技术网

C++ 数组大小取决于sizeof()结构字段

C++ 数组大小取决于sizeof()结构字段,c++,gcc,data-structures,ubuntu,redhat,C++,Gcc,Data Structures,Ubuntu,Redhat,我有一个包含一组结构的全局include文件。在我的程序中,我有一个包含成员数组的类。此数组中的元素数取决于特定结构中特定字段的大小。我希望这样,如果结构字段的大小发生更改,数组大小将自动更新。我已经能够通过以下表达式成功地做到这一点: bool shadowChkBox[sizeof(FSCconfigType::WriteEn)*8*MAX_FSCS]; FSCconfigType是结构类型,WriteEn是其中一个字段。现在这只在ubuntu上起作用了。在RHEL 5上,编译器将其声明为

我有一个包含一组结构的全局include文件。在我的程序中,我有一个包含成员数组的类。此数组中的元素数取决于特定结构中特定字段的大小。我希望这样,如果结构字段的大小发生更改,数组大小将自动更新。我已经能够通过以下表达式成功地做到这一点:

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

FSCconfigType是结构类型,WriteEn是其中一个字段。现在这只在ubuntu上起作用了。在RHEL 5上,编译器将其声明为错误。我还有什么其他的选择来做这件事?我正在使用Qt。

一个脆弱的答案是将WriteEn和下一个字段的offsetof值之差取上去(否则,整个结构的大小)

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


一个更大的问题是,如果您重新排列字段而不解决此问题,会发生什么情况-但如果您非常绝望,这可能是一个选项。

以下是一个可能的答案:

#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;
}
#包括
结构A
{
INTA;
int b;
INTC;
};
bool项目[sizeof(重新解释铸造(0)->b)];
int main()
{
std::cout b)
#包括
结构C
{
int iv;
void*pv;
char-buf[128];
};
模板
std::size\u t field\u size(TFieldType(TObj::*))
{
返回sizeof(TFieldType);
}
int main(){

std::cout您在RH上遇到的错误是什么?我怀疑这更多地与您使用的是哪个版本的GCC有关,而不是与哪个版本的Linux有关。您是否可以直接使用字段的类型,而不是通过字段引用它?我猜不是(因为这是sizeof可能更改的原因),但检查一下也无妨。@steve事实上,这就是为什么sizeof可能change@yanbellavance,我同意你不应该要求你的用户升级gcc。我只是想澄清这个问题。我认为代码应该编译,如果它是旧版本gcc中的一个bug,那么我认为你将被一个更丑陋的workaround.thx它起作用了。不过有一个问题。你到底在用(0)做什么?似乎是一个空地址。除了确定它的类型外,
sizeof
的参数不会被计算。将
null
强制转换为
A*
是一种很好的方法,可以获得指向
A
的指针类型(
(例如,printf(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;
}