extern "C"的解读

来源:互联网 发布:大麦盒子网络连接失败 编辑:程序博客网 时间:2024/05/28 15:08

    最近在学习底层的ring0层程序,环境搭建好了,但是总是出现未解析的错误,找不到ZwQuerySystemInformation的错误,以及KeServiceTableDescriptor,都是未解析的错

误,开始以为是环境搭建有误,收拾了好几次,总是不成功,在网上搜索答案,看到ZwQuerySystemInformation依赖于ntdll.dll文件还自作聪明的,#import "ntdll.dll"可是,

这样出现了更多错误,而extern "C",是两个指令,一个是extern,表示该变量来自于其他文件,同时该变量应该是全局变量,即,变量的作用域是全局的,所以extern说明了两

个问题,一个是:变量来自于其他文件,另一个是其作用域是全局的。而"C"则是说明了编译方式,

void Foo(int x,int y);

如果是以C++编译方式,结果就是_Foo_int_int之类的,不同的编译器可能会产生不同的结果,这样的名字包含了函数名,参数类型和参数数量,C++就是因为这种方式实现重载

的,但是

如果是C的编译方式,可能就是简单的_Foo,因而C是不支持重载的,所以我们知道,我们看到的函数名称和实际编译出来的函数名称是不同的。

默认情况下,在VS2010默认是C++的编译方式,编译出来的函数名称和dll中的函数名称是不一样的,因而找不到相应的函数,也就是未解析的

...