【问题标题】:Naked function prototype declaration裸函数原型声明
【发布时间】:2021-03-17 06:57:31
【问题描述】:

我尝试在头文件中声明一个裸函数原型:

inline __declspec(naked) void HookSoundFileSub_BZCC_Asm(char  *Src, int pedx, int a3, int a4, int a5, int a6);
inline __declspec(naked) void __stdcall HookDamageSub_BZCC_Asm(DWORD * ecx, int ebp, int edi, int a4, long long *a5, int a6);

我收到此错误 (C2488) 'identifier' : 'naked' 只能应用于非成员函数定义:

https://docs.microsoft.com/en-us/cpp/error-messages/compiler-errors-1/compiler-error-c2488?view=msvc-160

有人建议??

谢谢!!

更新:

我已经尝试过这段代码:

 void HookSoundFileSub_BZCC_Asm(char  *Src, int pedx, int a3, int a4, int a5, int a6);
 void __stdcall HookDamageSub_BZCC_Asm(DWORD * ecx, int ebp, int edi, int a4, long long *a5, int a6);

没有编译错误,但函数崩溃。

如果我在主 c++ 文件中正确使用这些函数,但我喜欢将其插入到不同的 c++ 文件模块中。

【问题讨论】:

  • 据我了解,naked 属性只与函数的定义有关,不能在函数的原型(/declaration)中指定。所以这无论如何都会产生编译器错误。

标签: c++ compiler-errors reverse-engineering


【解决方案1】:

你提供的URL够清楚了。

naked只能应用于非成员函数定义,不能 声明。

// C2488.cpp
// compile with: /c
// processor: x86
__declspec( naked ) void func();   // C2488  declaration, not definition
__declspec( naked ) void i;   // C2488  i is not a function

__declspec( naked ) void func() {}   // OK

只需将函数声明中的__declspec(naked) 放到定义中即可。

NakedFunction.cpp:

__declspec(naked) void NakedFunction() { /* ... */ }

NakedFunction.h:

void NakedFunction();

Main.cpp:

#include "NakedFunction.h"

int main()
{
    NakedFunction();
    return 0;
}

一切正常。

【讨论】:

  • @user3449922 只需将函数声明中的__declspec(naked) 放到定义中,一切正常。
  • @user3449922 仅在定义函数实现时使用。如果您无法控制它,因为它是外部的,那么包装器可能会起作用。否则你只是不走运。
猜你喜欢
  • 2011-08-07
  • 2012-07-15
  • 1970-01-01
  • 2011-12-16
  • 2016-05-23
  • 2012-01-19
  • 1970-01-01
  • 1970-01-01
  • 2018-10-26
相关资源
最近更新 更多