extern "C"、dllexport和.def

 

(2006-11-13 23:33:00)

简单一点来说。



extern "C"就是告诉C++编译器,对所声明的部分采用C的处理方式来进行名称的转换。


但是,extern "C"和extern "C"{...}这两种形式略有区别。前者有两层含义:外部连接和C语言连接;后者仅有C语言连接一层含义。下面的两种形式是等同的:


extern "C" int foo;
 
 
extern "C" void bar();
 
 
和
 
 
extern "C" {
 
 
extern int foo;
 
 
extern void bar();
 
 
}


对于函数来说,带不带外部声明extern是一样的,但对于变量来说,就不一样了。所以extern "C"和extern "C"{...}这两种形式对变量来说是有区别的,前者相当于后者的括号内再加extern。



dllexport就是把所声明的标识符输出到DLL中,以便让调用者可以找得到。



对于C++函数来说,将采用C++的名称转换方式。如果不确定C++是如何转换函数名称的,可以使用.def文件(EXPORT关键字)或是把函数声明为extern "C"。



当用.def文件从DLL中输出变量时,不需要再在变量前面加__declspec(dllexport)。但是,在使用DLL的文件中,仍然必须用__declspec(dllimport)来声明该变量。



应该说dellexport跟extern "C"是两个不相关的概念。但如果使用.def后,可能达到同时使用dllexport和extern "C"的效果。