转载: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 ;
}

最新文章

  1. myBatis中 collection 或 association 联合查询 中column 传入多个参数值
  2. CSS3的学习--实现瀑布流
  3. windows2003开启vpn服务
  4. 转(JSONP处理跨域事件)
  5. 直接使用editbox.clear()清空时,有时会无法清除完全,此时有清空文本框的另一种方法
  6. volley(2) 参数code : or_barcode, pr_ismsd:false , method:GET
  7. 《Entity Framework 6 Recipes》中文翻译——第十章EntityFramework存储过程处理(八)
  8. DOS - COPY
  9. 32位程序调用Oracle11gR2数据库libclntsh.so失败
  10. 迭代的是人,递归的是神。——L. Peter Deutsch
  11. .net 企业管理系统快熟搭建框架
  12. 关于xamarin.forms 中 list 的loadmore
  13. redis 梳理笔记(二)
  14. BZOJ_3932_[CQOI2015]任务查询系统_主席树
  15. Ubuntu18.04 Desktop Entry
  16. 压力测试Apache
  17. Git 创建分支与合并分支
  18. 返回json格式数据乱码
  19. Ultimate guide to learning AngularJS in one day
  20. CGI-FASTCGI-PHPFPM

热门文章

  1. LeetCode——Binary Tree Paths
  2. navicat 激活流程
  3. 【BZOJ4195】[Noi2015]程序自动分析 并查集
  4. android 使用动画 Button移动后不响应点击事件的解决办法
  5. for update 和 t.rowid的区别
  6. 一步步从Spring Framework装配掌握SpringBoot自动装配
  7. 170525、解决maven隐式依赖包版本问题
  8. .net各版本framework官方下载地址
  9. using the library to generate a dynamic SELECT or DELETE statement mysqlbaits xml配置文件 与 sql构造器 对比
  10. ConcurrentHashMap实现解析