C++ 为什么要使用#ifdef __cplusplus extern "C" { #endif
转载:http://www.cnblogs.com/ayanmw/archive/2012/03/15/2398593.html
转载:http://blog.csdn.net/zkl99999/article/details/48134621
转载: http://www.jianshu.com/p/5d2eeeb93590
经常看到别人的头文件 有这样的代码
#ifdef __cplusplus
extern "C" {
#endif // C 样式 的函数 #ifdef __cplusplus
}
#endif
为什么要这样呢?
因为C语言不支持重载函数,也就是同名函数,参数却不一样,C++支持,其编译器对函数名的处理方法不一样,导致 虽然都是C 样式的函数,不同编译器编译出来的不一样。
如果是C语言编译的中间文件,要C++ 来调用,那么就需要这个了,C++ 有了 extern "C" 就会按照 C 语言的方法进行函数命名。这样编译出来的中间文件就是C样式的函数名,C/C++ 都可以调用。
如果C++ 编译的中间文件,要C语言来调用,是不行的。这也就为什么DLL中常看见extern "C" {},windows是采用C语言编制他首先要考虑到C可以正确调用这些DLL,而用户可能会使用C++而extern "C" {}就会发生作用。
总结:
1.extern "C"表示编译生成的内部符号名使用C约定。
2.C++支持函数重载,而C不支持,两者的编译规则也不一样,函数被C++编译后在符号库中的名字与C语言的不同。
例如,假设某个函数的原型为: void foo( int x, int y ); 该函数被C编译器编译后在符号库中的名字可能为_foo,而C++编译器则会产生像_foo_int_int之类的名字(不同的编译器可能生成的名字不 同,但是都采用了相同的机制,生成的新名字称为“mangled name”)。_foo_int_int这样的名字包含了函数名、函数参数数量及类型信息,C++就是靠这种机制来实现函数重载的。
例子:
test.h
#ifndef _TEST_H_
#define _TEST_H_
#ifdef _cplusplus
extern "c"
{
#endif
extern int Add(int a, int b);
extern int Sub(int a, int b); #ifdef _cplusplus
}
#endif #endif
test.c
#include "test.h" int Add(int a, int b)
{
return a + b;
} int Sub(int a, int b)
{
return a - b;
}
main.cpp
#include <stdio.h> extern "C"
{
#include "test.h"
} int main()
{
printf("Add=%d\n",Add(,));
printf("Sub=%d\n",Sub(,));
return ;
}
最新文章
- myBatis中 collection 或 association 联合查询 中column 传入多个参数值
- CSS3的学习--实现瀑布流
- windows2003开启vpn服务
- 转(JSONP处理跨域事件)
- 直接使用editbox.clear()清空时,有时会无法清除完全,此时有清空文本框的另一种方法
- volley(2) 参数code : or_barcode, pr_ismsd:false , method:GET
- 《Entity Framework 6 Recipes》中文翻译——第十章EntityFramework存储过程处理(八)
- DOS - COPY
- 32位程序调用Oracle11gR2数据库libclntsh.so失败
- 迭代的是人,递归的是神。——L. Peter Deutsch
- .net 企业管理系统快熟搭建框架
- 关于xamarin.forms 中 list 的loadmore
- redis 梳理笔记(二)
- BZOJ_3932_[CQOI2015]任务查询系统_主席树
- Ubuntu18.04 Desktop Entry
- 压力测试Apache
- Git 创建分支与合并分支
- 返回json格式数据乱码
- Ultimate guide to learning AngularJS in one day
- CGI-FASTCGI-PHPFPM
热门文章
- LeetCode——Binary Tree Paths
- navicat 激活流程
- 【BZOJ4195】[Noi2015]程序自动分析 并查集
- android 使用动画 Button移动后不响应点击事件的解决办法
- for update 和 t.rowid的区别
- 一步步从Spring Framework装配掌握SpringBoot自动装配
- 170525、解决maven隐式依赖包版本问题
- .net各版本framework官方下载地址
- using the library to generate a dynamic SELECT or DELETE statement mysqlbaits xml配置文件 与 sql构造器 对比
- ConcurrentHashMap实现解析