由于从 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的主要内容,如果未能解决你的问题,请参考以下文章
从 double 到 const int 的 C++ 类型转换无法正常工作
无法在赋值c ++中将char *转换为int * [关闭]