4

我在这里创建了一些数据结构(使用 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”转换为“无符号字符”

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

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

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

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

4

2 回答 2

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 };
于 2012-07-19T13:55:29.797 回答
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 };

谢谢大家!

于 2012-07-19T17:22:11.427 回答