#ifdef __cplusplus
extern "C"
{
#endif
#include <NTDDK.h>
#ifdef __cplusplus
}
#endif
从上面可以看出,在包含NTDDK.h这个头文件的时候用了extern "C",是因为C++和C语言的编译器的编译后的函数符号不一致,可能会导致链接错误。下面详细说明:
各种调用约定:
C语言调用约定 __cdecl 调用者清除堆栈,会在call后add esp,***
标准调用约定 __stdcall 被调用的子函数清除堆栈,最后ret ***
快速调用约定 __fastcall 参数在寄存器传递
C++ 类成员函数调用约定 __thiscall 用来方位类成员函数
C++ 托管函数调用约定 __clrcall 多用于.net技术
对于void Func(int a, int b) 这个函数,由于清除堆栈的方式不同
_cdecl 的这个函数在目标文件中产生的符号为 _Func
_stdcall 的这个函数在目标文件中产生的符号为 _Func@8
再举个例子:驱动入口DriverEntry这个函数的默认符号为 _DriverEntry@8,如果用的是_cdecl来编译,可想而知就会成了_DriverEntry,链接错误。
再说说C++为了方便重载技术的实现,会把上面说的Func函数编译成符号(导出名)_?Foo@@YGXHH@Z,就是把参数的类型都作为符号了,这样的话当然会出现链接错误了。
加上extern "C"就可以强制C++编译器按照C语言的方式来编译。