由于从 C 到 C++ 的类型转换,无法编译并出现错误 C2440

Posted

技术标签:

【中文标题】由于从 C 到 C++ 的类型转换,无法编译并出现错误 C2440【英文标题】:Unable to compile with Error C2440 due to type cast from C to C++ 【发布时间】:2019-12-30 14:48:43 【问题描述】:
inline BOOL FupVmCall(ULONG_PTR hypercall_number, void *context) 
#pragma section(".asm", read, execute)
  __declspec(allocate(".asm")) static const BYTE CODE[] = 
      0x0F, 0x01, 0xC1, //    vmcall
      0x74, 0x0E,       //    jz      short errorWithCode
      0x72, 0x04,       //    jb      short errorWithoutCode
      0x48, 0x33, 0xC0, //    xor     rax, rax
      0xC3,             //    retn
                        // errorWithoutCode:
      0x48, 0xC7, 0xC0, 0x02, 0x00, 0x00, 0x00, //    mov     rax, 2
      0xC3,                                     //    retn
                                                // errorWithCode:
      0x48, 0xC7, 0xC0, 0x01, 0x00, 0x00, 0x00, //    mov     rax, 1
      0xC3,                                     //    retn
  ;

  typedef unsigned char(__stdcall * AsmVmxCallType)(
      _In_ ULONG_PTR hypercall_number, _In_opt_ void *context);

#pragma warning(suppress : 4055)
  AsmVmxCallType AsmVmxCall = (AsmVmxCallType)CODE;

  __try 
    return AsmVmxCall(hypercall_number, context) == 0;
   __except (EXCEPTION_EXECUTE_HANDLER) 
    SetLastError(GetExceptionCode());
    return FALSE;
  

我正在尝试使用 VS2019 从 C++ 项目编译上述代码

如果我将主文件更改为 main.c,它编译没有任何问题

但是,如果我将其更改为 main.cpp,则会出现 C2440 类型转换问题。

C2440   'type cast': cannot convert from 'const BYTE [27]' to 'AsmVmxCallType'
AsmVmxCallType AsmVmxCall = (AsmVmxCallType)CODE;

我什至尝试用extern "C" 包裹,但没有解决问题。

如何进行这种类型转换?

【问题讨论】:

reinterpret_cast<AsmVmxCallType>(CODE) 应该可以工作,假设 AsmVmxCallType 是一个指针类型。当然,这会破坏 C 的兼容性。 【参考方案1】:

您可以先将 CODE 转换为 void 指针,然后将其转换为您的函数指针:

AsmVmxCallType AsmVmxCall = (AsmVmxCallType)(void *)CODE;

【讨论】:

以上是关于由于从 C 到 C++ 的类型转换,无法编译并出现错误 C2440的主要内容,如果未能解决你的问题,请参考以下文章

C与C++不同

无法从一种迭代器类型转换为另一种,但两者完全相同

从 double 到 const int 的 C++ 类型转换无法正常工作

无法在赋值c ++中将char *转换为int * [关闭]

c++ makefile 编译出错,无法转换 main()::

C++从青铜到王者第二十四篇:C++的类型转换