结构数组 - 初始化错误

Posted

技术标签:

【中文标题】结构数组 - 初始化错误【英文标题】:Array of structs - initialization errors 【发布时间】:2012-07-19 12:57:22 【问题描述】:

我在这里创建了一些数据结构(使用 MFC),在 MS Visual C++ 6.0 中编译(是的,它很旧)。

struct SOpcodeData

    BYTE m_byDataType;
    DWORD m_dwMinValue;
    DWORD m_dwMaxValue;
    WORD m_wRepeat;
;

const BYTE DATA_U8   = 0;
const BYTE DATA_U16  = 1;
const BYTE DATA_U32  = 2;

SOpcodeData MY_BYTE  =  DATA_U8,   0,  UCHAR_MAX,  1 ;
SOpcodeData MY_WORD  =  DATA_U16,  0,  USHRT_MAX,  1 ;
SOpcodeData MY_DWORD =  DATA_U32,  0,  UINT_MAX,   1 ;

此代码编译时没有错误或警告。但是当我尝试创建一个我的结构类型的数组时......

SOpcodeData foo[] =  MY_BYTE, MY_BYTE, MY_WORD, MY_DWORD, MY_BYTE ;

VC6对每个数组元素弹出编译错误:

device.cpp(78) : error C2440: 'initializing' : cannot convert from 'struct SOpcodeData' to 'unsigned char'

没有可以执行此转换的用户定义转换运算符,或者无法调用该运算符

显然将整个结构类型误认为是第一个结构字段,这是一个 BYTE(或者对于那些不习惯 MFC 的人来说是无符号字符)。

在 Visual Studio 2010 上试过,效果很好。但我需要使用 VC6 构建它。

我尝试在数组初始化中显式转换为结构类型,但这是多余的,并没有解决任何问题。还有其他想法吗?

【问题讨论】:

【参考方案1】:

由于您坚持使用具有大量已知错误的编译器,因此您将需要一个丑陋的解决方法:

#define MY_BYTE_CONTENT   DATA_U8,   0,  UCHAR_MAX,  1 
#define MY_WORD_CONTENT   DATA_U16,  0,  USHRT_MAX,  1 
#define MY_DWORD_CONTENT  DATA_U32,  0,  UINT_MAX,   1 

SOpcodeData MY_BYTE  = MY_BYTE_CONTENT;
SOpcodeData MY_WORD  = MY_WORD_CONTENT;
SOpcodeData MY_DWORD = MY_DWORD_CONTENT;

SOpcodeData foo[] =  MY_BYTE_CONTENT, MY_BYTE_CONTENT, MY_WORD_CONTENT, MY_DWORD_CONTENT, MY_BYTE_CONTENT ;

【讨论】:

谢谢!它成功了。完美编译。 :-) 就我个人而言,我不会在 VC6 上编译,但我必须这样做。问候! 该解决方法应该是有效的,但我不认为这是一个错误 - 数组初始化列表通常不接受其他变量来初始化数组元素,除了可能用于内置类型(以及可能只是一个常见的扩展 - 我不记得标准对此有什么说法,所以我可能弄错了)。 我也不了解标准,但是使用非内置类型的数组初始化在 Visual Studio 2010 中工作得很好。 @twalberg:我认为你 100% 错了。如果您想在需要编译时常量整数表达式的上下文中使用结果变量(例如,作为数组类型中的边界),则对初始化器有限制,但初始化通常可以是任何有效的表达式,因此可以聚合初始化器的各个部分。【参考方案2】:

我们找到了另一种解决方案,不使用#define:使用构造函数来初始化数据结构。有点像这样:

struct SOpcodeData

    SOpcodeData (const BYTE byDataType, const DWORD dwMinValue, const DWORD dwMaxValue, const WORD wRepeat)
      : m_byDataType(byDataType), m_dwMinValue(dwMinValue), m_dwMaxValue(dwMaxValue), m_wRepeat(wRepeat)
    

    BYTE m_byDataType;
    DWORD m_dwMinValue;
    DWORD m_dwMaxValue;
    WORD m_wRepeat;
;

SOpcodeData MY_BYTE  (DATA_U8,   0,  UCHAR_MAX,  1);
SOpcodeData MY_WORD  (DATA_U16,  0,  USHRT_MAX,  1);
SOpcodeData MY_DWORD (DATA_U32,  0,  UINT_MAX,   1);

SOpcodeData foo[] =  MY_BYTE, MY_WORD, MY_DWORD ;

谢谢大家!

【讨论】:

以上是关于结构数组 - 初始化错误的主要内容,如果未能解决你的问题,请参考以下文章

尝试初始化结构数组时出现段错误

C++ 错误:初始化结构实例的向量数组成员

在 VS2013 中使用指定的初始化程序来初始化结构中的 2D 字符数组初始化程序会发出错误 C2078

记录一个常犯的错误:直接访问数据结构内部的数组

结构或类中的数组初始化

如何在结构定义中初始化数组?