extern C

extern "C"

LuChenQun edited this page Mar 30, 2019 · 3 revisions

在C++中常在头文件见到extern "C"修饰函数,那有什么作用呢? 是用于C++链接在C语言模块中定义的函数。

C++虽然兼容C,但C++文件中函数编译后生成的符号与C语言生成的不同。因为C++支持函数重载,C++函数编译后生成的符时带有函数参数类型的信息,而C则没有。

例如int add(int a, int b)函数经过C++编译器生成.o文件后,add会变成形如add_int_int之类的, 而C的话则会是形如_add, 就是说:相同的函数,在C和C++中,编译后生成的符号不同。

这就导致一个问题:如果C++中使用C语言实现的函数,在编译链接的时候,会出错,提示找不到对应的符号。此时extern "C"就起作用了:告诉链接器去寻找_add这类的C语言符号,而不是经过C++修饰的符号。

C++调用C函数的例子: 引用C的头文件时,需要加extern "C"

//cExample.h
#ifndef C_EXAMPLE_H
#define C_EXAMPLE_H
int add(int x,int y);
#endif//cExample.c
#include "cExample.h"
int add( int x, int y ) {return x + y;
}//cppExample.cpp
extern "C" {#include "cExample.h"
}int main(int argc, char* argv[]) {add(2,3); return 0;
}
//Generate cExample.o file
gcc -c cExample.c
g++ -c cppExample.cpp
g++ cppExample.cpp cExample.o -o main

注意,如果cppExample.cpp中没有extern "c"的话,会在最后一步链接的时候出错。

C中调用C++函数:extern "C"在C中是语法错误,需要放在C++头文件中。

// cppExample.h
#ifndef CPP_EXAMPLE_H
#define CPP_EXAMPLE_H
extern "C" { int add( int x, int y ); }
#endif// cppExample.cpp
#include "cppExample.h"
int add( int x, int y ) {return x + y;
}// cExample.c
extern int add( int x, int y );
int main() {add( 2, 3 ); return 0;
}

Reference: http://www.cppblog.com/macaulish/archive/2008/06/17/53689.html

转载于:https://www.cnblogs.com/ggzhangxiaochao/p/11419857.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/549615.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

病毒与恶意程序

仅仅在几年前,我们还可以清晰地辩明哪些软件是具有恶意的而哪些软件是无害的,然而在今天,病毒无论在种类还是数量上都呈现出爆炸性的增长,甚至有大量的非授权软件已经超过了病毒的意义范畴,恶意程序已经形成了一个大的…

三层体系结构学习总结

三层架构学习总结KeyWords: 三层体系结构,DAL,BLL,USL,学习心得,三层体系结构,软件三层体系结构 By Flouse2008年7月24日三层体系结构的概念 用户界面表示层(USL)业务逻辑层(BLL)数据访问层(DAL) 图一:BLL将USL与DAL隔开了,并且加入了业务规则 各层的作用…

面向对象(1)

1.对象的比较 和equals: :比较两个变量的值是否相等。 比较两个引用类型的内存地址是否相等,即是否指向同一对象。eqeal():比较两对象内容是否一致 2.抽象类 抽象类是一种模板模式,为所有子类提供了一个通用模板,子类…

改变人生的几句话

第一句话是:优秀是一种习惯。 这句话是古希腊哲学家亚里士多德说的。如果说优秀是一种习惯,那么懒惰也是一种习惯。人出生的时候,除了脾气会因为天性而有所不同,其他的东西基本都是后天形成的,是家庭影响和教育的结果…

面向对象(2)

1、变量 变量的本质是一个“可操作的存储空间”,空间的位置是确定的,但是里面放置的什么值是不确定的。 int整型 是4个字节,每个字节有8位,所以int定义的变量最多可存储32bit的信息。 double双精度浮点型和long长整型有8个字节 2、…

具有全局观的网络拓扑

近年来,IT技术发展迅速,随着各个企业IT系统的建设,网络架构从单一的局域网扩展到广域网,网络设备也是类型多种多样,路由器、交换机、防火墙、IDS、***等等,而且网络设备的供应厂商也是越来越多,…

拥塞管理

在主干网设备局域网连接接口上,在入方向(局域网向广域网流向)进行拥塞管理的部署。在网络中,当局域网中的数据网广域网链路上发送时,到达的速度大于接口发送分组的速度时,在该接口处就会产生拥塞。如果没有…

硬件_WIFIBlue

WIFI 平台:全志 模组:AP6210 (WF BT FM) 模式:STA  AP  Wi-Fi Direct(点对点) 接口:SDIO / USB——WF UART PCM——BT PCM数字音频接口,说明接口传输的音频数…

ActiveX控件的另类免费签名法

注意:一直都有人提到一个问题,就是使用支付宝的证书,会不会有安全问题,这一点是肯定的,所以这个证书只能拿来做软件签名用,不能拿来做支付的。 这几天手上在做一个项目,要用到ActiveX控件&#…

运算符(1)

1、自增自减 int a 3; int b a;//执行完后,b3。先给b赋值,再自增。 System.out.println("a"a"\nb"b); int a 3; int b a;//执行完后,b4。先自增,后赋值。 System.out.println("a"a"\nb"b); 自减…

web布局最实用的12条css技巧

1&#xff1a;Rounded corners without images 效果图—— Rounded corners without images<div id”container”> <b class”rtop”> <b class”r1″></b> <b class”r2″></b> <b class”r3″></b> <b class”r4″>&l…

OCP-052考试题库汇总(47)-CUUG内部解答版

Which three are true about the Automatic Database Diagnostic Monitor (ADDM)? A)It improves database performance by automatically implementing Oracle ‘s best practices. B)It can assist the DBA in diagnosing database instance startup failures. C)It can be …

python 函数式编程

简介 简单来说就是 没有变量&#xff0c;所有的操作都通过函数实现 参考链接 廖雪峰py 转载于:https://www.cnblogs.com/eat-too-much/p/11435717.html

运算符(2)

1.三目运算符 /* 三目运算符/ public class demo1 { public static void main(String[] args) { int score 80; String type score<60?"不及格":"及格"; System.out.println(type); } } 2.运算符优先级逻辑非>逻辑与>逻辑或a||b&&c的运…

虚拟的有时比真实的还要好(+奥运杂谈)

虚拟技术十分热门.虚拟技术是将一台物理硬件计算机虚拟成多台软件计算机.每一台虚拟出来的软件计算机(以下叫做虚拟机)用起来都就象是在用那台被虚拟的硬件计算机(以下叫做真实机)完全一样.当然这样的说法忽略了虚拟机相对于真实机在执行效益上不可避免所存在的损失.所以如何减…

yield 和 生成器

简介 yield 就可以让一个函数成为生成器 参考链接 CSDN博客 转载于:https://www.cnblogs.com/eat-too-much/p/11436015.html

异步实现,查询大量数据时的加载

AsyncWorker_Demo.rar转载于:https://www.cnblogs.com/RobotTech/archive/2008/08/26/1276553.html

类型转换与键盘输入

1.自动类型装换 自动类型转换指的是容量小的数据类型可以自动装换为容量大的数据类型。如图2-6所示&#xff0c;黑色实线表示的是无数据丢失的 //容量小的可以自动向容量大的转化 //可以将整型常量赋值给byte/short/char等变量&#xff0c;而不需要强制类型转换&#xff0c;只要…

ORA-01502 state unusable错误成因和解决方法[转]

接到开发人员和业务人员的通知&#xff0c;说一个登陆页面不能用了&#xff0c;报错&#xff1a;2005-01-31 13:59:02,721 [com.aspire.common.dao.OamUserDAO]- -214:select错误java.sql.SQLException: ORA-01502 state这个错误是由于索引失效造成的&#xff0c;重建索引后&am…

掷骰子游戏和条件语句

1.java掷骰子游戏 public class iftest {public static void main(String[] args) {System.out.println("#####掷骰子游戏#####");System.out.println("#################");//投掷三个色子看看今天手气怎么样&#xff1f;int i (int)(6*Math.random()1);…