使用目的
为了实现动态链接库文件在编译时,导出函数的名称不要发生改变,在定义导出函数时,需要加上限定符extern “C”,而且C必须大写。
extern “C”是告诉C++编译器以C Linkage方式编译,也就是抑制C++的Name-mangling机制。在DLL中经常看到,主要用于动态链接库,使得导出函数名称与C语言规则一致,方便不同的编译器甚至不同的开发语言调用。
C++ Name-mangling
Name-mangling是指为了在目标文件符号表中和链接过程中使用的名字通常和编译目标文件的源程序中的名字不一样,编译器将目标源文件中的名字进行调整。
Name-mangling技术在C++中最直接的例子就是函数重载。
举例说明
- 不加extern “C”声明
//foo.h
#ifndef __FOO_H__
#define __FOO_H__
void foo(int x, int y);
#endif
//test.cpp
#include"foo.h"
foo(1,2);
在链接时,链接器会从foo.obj中寻找符号_foo_int_int。
- 加extern “C”声明
#ifndef __FOO_H__
#define __FOO_H__
extern "C" void foo(int x, int y);
#endif
在链接时,链接器会寻找未改名的符号名_foo。
所以,extern “C”声明目的就是为了实现C++与C或其他语言的混合编程。
常见代码
#ifndef __EXAMPLE_H__
#define __EXAMPLE_H__
#ifdef __cplusplus
extern "C" {
#endif
//do somethings
#ifdef __cplusplus
}
#endif
#endif
__cplusplus是C++中自定义的一个宏,定义了这个宏就表示这是一段cpp代码。
注意事项
C++的函数或变量要声明在extern “C”{}里,但是C语言中不能使用extern “C”,否则编译出错(错误提示:error C2059: syntax error : ‘string’),错误原因是extern “C”是C++中的关键词,不是C的。