结构数组 - 初始化错误
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 ;
谢谢大家!
【讨论】:
以上是关于结构数组 - 初始化错误的主要内容,如果未能解决你的问题,请参考以下文章