【问题标题】:array size dependent on sizeof() a struct field数组大小取决于 sizeof() 结构字段
【发布时间】:2010-11-28 21:46:08
【问题描述】:

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

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

FSCconfigType 是结构类型,WriteEn 是字段之一。现在这有效,但仅在 ubuntu 上有效。在 RHEL 5 上,编译器将其声明为错误。我还有什么其他选择可以做到这一点?我正在使用 Qt。

【问题讨论】:

  • 你在 RH 上遇到了什么错误?
  • 我怀疑这与您使用的 GCC 版本有关,而不是与 Linux 的版本有关。
  • 可以直接使用字段的类型,而不是通过字段引用吗?我猜不是(因为这是 sizeof 可能会改变的原因),但检查一下也无妨。
  • @steve 实际上这就是 sizeof 可能改变的原因
  • @yan bellavance,我同意您不应该要求您的用户升级 gcc。我只是想澄清这个问题。我认为代码应该可以编译,如果它是旧版本 gcc 中的错误,那么我认为您将遇到更丑陋的解决方法。

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


【解决方案1】:

这是一个可能的答案:

#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)做什么?似乎是一个空地址。
  • sizeof 的参数除了确定其类型外,不会被计算。将NULL 转换为A * 与获取具有指向A 的指针类型的任何方法一样好。 (例如,( A*)printf(0) 也可以。)
【解决方案2】:

一个脆弱的答案是获取 WriteEn 和下一个字段的 offsetof 值的差异(否则,整个结构的大小)。

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

一个更大的问题是,如果您重新排列字段而不修复此问题会发生什么 - 但如果您不顾一切,这可能是一个选择。

【讨论】:

    【解决方案3】:
    #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;
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-03-08
      • 2011-02-09
      • 1970-01-01
      • 1970-01-01
      • 2014-04-23
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多