C++中的extern "C"声明简介

使用目的

为了实现动态链接库文件在编译时,导出函数的名称不要发生改变,在定义导出函数时,需要加上限定符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的。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值