vc6 到 vs2010 移植错误

Posted

技术标签:

【中文标题】vc6 到 vs2010 移植错误【英文标题】:vc6 to vs2010 porting error 【发布时间】:2013-04-12 04:34:28 【问题描述】:

我被困在将我的项目从 VC6 移植到 VS2010 的过程中。请任何人都可以帮助我。

void CEdchLoop::ReceiveSdu(UINT8* Sdu, UINT32 BitLength, int Fn)

UINT8* pPdu   = Sdu;
    int Bit       = 8;

    UINT32 SourceId    = GetBitsL(pPdu, BitLength, Bit, 32);
    UINT32 PduUniqueId = GetBitsL(pPdu, BitLength, Bit, 32);       

在上面的代码中,我收到错误 C2664: 'GetBitsL' : cannot convert parameter 1 from 'UINT8 *' to 'const UINT8 *&'

GetBitsL 被定义为UINT32 GetBitsL(const UINT8*& Bin, UINT32& BitLength, int& Bit, int Count)

请任何人帮助我解决这个问题。如果这不是一个绝妙的问题,我很抱歉。但傻五分钟总比永远傻。

提前致谢。

【问题讨论】:

【参考方案1】:

这个问题最好用演示来解释:

int * ip;
const int *& cipr = ip;

好的,此时,cipr 是对ip 的引用。这是不合法的,您将在以下部分中了解原因。

const int * cip = some_const_data;
cipr = cip;

这个赋值是合法的,因为作为一个(引用)指向 const 数据的指针,cipr 可以被赋值为指向 const 数据。但正因为如此,由于cipr 是对ip 的引用,现在ip 指向常量数据。这是个问题:

*ip = 7;

这是合法的,因为ip 的类型是指向非常量int 的指针。但是,通过上面的一些技巧,我们让它指向 const 数据。这是不允许的,所以我们最初的声明,我们将cipr 绑定到ip 必须是非法的。这与您通过将pPdu 传递给GetBitsL 来尝试做的事情相同。

【讨论】:

【参考方案2】:

GetBitsL 需要引用指向 const-UINT8 的指针。您正在给它一个指向 volatile-UINT8 的引用,并且没有直接的引用转换。将pPdu 更改为:

// UINT8* pPdu   = Sdu;
const UINT8* pPdu(Sdu);

它仍然初始化为指向与Sdu 相同的UINT8,但现在作为函数期望的指向const-UINT8 的指针。该函数仍然可以修改指针,但不能修改它指向的内容。 (这应该暗示您可能没有按照设计意图使用该功能,因此请考虑一下)。

【讨论】:

以上是关于vc6 到 vs2010 移植错误的主要内容,如果未能解决你的问题,请参考以下文章

将 WCF 项目从 VS 2008 移植到 2010 时出错

VC++ 6 链接器错误

vs2010和blend 4都装好了,我怎么将Blend 4画的东西移植到我的VS2010 WPF应用程序中呢,请高手指点,谢谢

将托管 C++ 从 vs2003 移植到 vs2008 的问题

移植一个VB6可以正常操作的CH341DLL,移植到VB2010出现的数据读写错误的问题

从 VS6 移植到 VS2008 时在不寻常的架构中使用单元测试?