我在这里创建一些数据结构(使用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):错误C2440:'初始化':无法从'struct SOpcodeData'转换为'unsigned char'
没有可用于执行此转换的用户定义转换运算符,或者无法调用运算符
通常它将整个结构类型误认为是第一个结构字段,它是BYTE(对于那些不习惯MFC的人来说是unsigned char)。
在Visual Studio 2010上尝试过,它运行得很好。但我需要使用VC6构建它。
我试图在数组初始化中显式转换为struct类型,但这是多余的,并没有解决任何问题。还有其他想法吗?
答案 0 :(得分:4)
由于您坚持使用包含大量已知错误的编译器,因此您需要一个丑陋的解决方法:
#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 };
答案 1 :(得分:0)
我们已经找到了另一个解决方案,没有使用#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 };
感谢大家!