【问题标题】:Best practice for handling down casts due to C++ C2664 when compiling 64 bit编译 64 位时由于 C++ C2664 处理向下转换的最佳实践
【发布时间】:2015-06-18 00:22:22
【问题描述】:

我有一个公开的方法,它接受一个 long* 作为这样的参数:

void  MyClass::MyPublicMethod(long *pLong) 

在这个方法中,我调用了一个接受 INT64* 的系统 API,如下所示:

void  MyClass::MyPublicMethod(long *pLong) 
{
    //SomeAPI::APIMethod(INT64* p64);
    SomeAPI::APIMethod(&pLong);
}

当编译为 x64 时,我得到一个错误(正确):

error C2664: 'SomeAPI::APIMethod(int64* p64)': cannot convert argument 1 from 'long*' to 'INT64*'

我不想更改我公开的方法的签名,因为它会产生许多下游后果。假设我知道 p64 不会超过 long 的限制,那么解决这种情况的最佳方法是什么?

这样的?

void  MyClass::MyPublicMethod(long *pLong) 
{
    // Use a local INT64 for the API call.
    INT64 tmp64 = *pLong;
    //SomeAPI::APIMethod(INT64* p64);
    SomeAPI::APIMethod(&tmp64);
    *pLong = (long)tmp64;
}

【问题讨论】:

  • 它不是很漂亮,但这似乎是最直接的处理方式。

标签: c++ pointers 64-bit c2664


【解决方案1】:

我认为您所看到的事实表明您正在测试的平台上的sizeof(long) 是 Windows,是 32 位(而不是 64)。您可以尝试测试该前提。

如果是这样,您可能需要传入long long,它应该是 64 位的。然后您必须更改方法签名。

作为旁注,当你写这篇文章时,

    *pLong = (long)tmp64;

您正在将 64 位值类型转换为 32 位值。是否可以保证 APIMethod 始终返回 32 位值。如果没有,那就有问题了。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-03-05
    • 1970-01-01
    • 2013-08-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多