首先,混合编程不是指在同一个文件里写C与C++。 比如说想在同意文件里同时 弱类型检查,又强类型检查,那真够呛。

混合编程包括:1,C++引用C的头文件;2,g++生成的.o与gcc生成的.o相链接。

1,在用C语言写的头文件中,经常加上如下 保护宏定义:

/*

example.h

*/

#ifndef EXAMPLE_H_

#define EXAMPLE_H_

#ifdef __cplusplus

extern "C"{

#endif

/*这里是头文件内容*/

/*头文件内容结束*/

#ifdef __cplusplus

}

#endif

#endif

2,关于extern "C"

当c++引用c的函数,结构体定义等时,要声明extern "C"  从某种意义上,这倒是像是在C++文件里写C的一种方法。事实上,由于c++会将函数标示符进行修饰后使用,而C不会,所以用C++编译的fun有可能是fun_int,这样在链接时会出现问题。使用extern “C”来解决这一问题,但带来的影响是不能重载了。

总之,extern "C"即叫编译器按照C的方式去处理。

3,具体编译命令 g++ 与 gcc

实例1:

//test.c

int fun(int a, int b)

{

return a+b;

}

//main.cpp

#include

#include "test.c"

int main()

{

printf("%d\n", fun(10, 11));

return 0;

}

首先理解include,include会把包含的文件直接加在本文件中,和copy过来一样。而我们直接包含了test.c文件,而不是头文件,

所以,直接:   g++ -o main main.cpp  即可得到可执行文件。

实例2:

//test.c

int fun(int a, int b)

{

return a+b;

}

//test.h

int fun(int, int);

//main.cpp

#include

#include "test.h"

int main()

{

printf("%d\n", fun(10, 11));

return 0;

}

正确的编译方法:

g++ -c test.c                 //生成test.o

g++ -c main.cpp          //生成main.cpp

g++ -o main test.o main.o  //链接,生成main可执行文件

错误的编译方法:

gcc -c test.c                 //生成test.o

g++ -c main.cpp          //生成main.cpp

g++ -o main test.o main.o  //链接,生成main可执行文件

如果,想使第二种方法正确,则在test.h中使用extern “C”声明,或者在main.cpp中,使用extern "C"声明

实例3

正确写法1

//test.c

int fun(int a, int b)

{

return a+b;

}

//test.h

#ifdef __cplusplus

extern "C"{

#endif

int fun(int, int);

#ifdef __cplusplus

}

#endif

//main.cpp

#include

#include "test.h"

int main()

{

printf("%d\n", fun(10, 11));

return 0;

}

正确写法2

//test.c

int fun(int a, int b)

{

return a+b;

}

//test.h

int fun(int, int);

//main.cpp

#include

extern "C"

{

#include "test.h"

}

int main()

{

printf("%d\n", fun(10, 11));

return 0;

}

正确写法3

//test.c

int fun(int a, int b)

{

return a+b;

}

//test.h

int fun(int, int);

//main.cpp

#include

extern "C" int fun(int, int)

int main()

{

printf("%d\n", fun(10, 11));

return 0;

}

其中正确写法3很有意思,在main.cpp中,并没有包含test.h, 这里写的extern "C" int fun(int, int),其实就是头文件内容。把头文件内容人工手写在main.cpp中和用include包含进来,是一样效果,这样就好理解了。 include“test.h” ,其实也就是写了一句 extern "C" int fun(int, int)。

所以严格来说,.h文件无所谓是属于C还是C++,被谁包含,就属于那种语言。

4, 关于g++,gcc

直接引用http://blog.ednchina.com/olivernie/161559/message.aspx上的原文,这段话是转载,不是我写的。

在国内搜索引擎搜索gcc与g++,大多都是在说g++会调用gcc来编译c++文件,国外stackoverflow大多再说gcc调用g++。

有争议,先mark

gcc和g++都是GNU(组织)的一个编译器。

误区一 :    gcc只能编译c代码,g++只能编译c++代码

两者都可以,但是请注意:

1.后缀为.c的,gcc把它当作是C程序,而g++当作是c++程序;后缀为.cpp的,两者都会认为是c++程序,注意,虽然c++是c的超集,但是两者对语法的要求是有区别的。C++的语法规则更加严谨一些。

2.编译阶段,g++会调用gcc,对于c++代码,两者是等价的,但是因为gcc命令不能自动和C++程序使用的库联接,所以通常用g++来完成链接,为了统一起见,干脆编译/链接统统用g++了,这就给人一种错觉,好像cpp程序只能用g++似的。

误区二  :  gcc不会定义__cplusplus宏,而g++会

实际上,这个宏只是标志着编译器将会把代码按C还是C++语法来解释,如上所述,如果后缀为.c,并且采用gcc编译器,则该宏就是未定义的,否则,就是已定义。

误区三 :   编译只能用gcc,链接只能用g++

严格来说,这句话不算错误,但是它混淆了概念,应该这样说:编译可以用gcc/g++,而链接可以用g++或者gcc   -lstdc++。因为gcc命令不能自动和C++程序使用的库联接,所以通常使用g++来完成联接。但在编译阶段,g++会自动调用gcc,二者等价。

用gcc编译c++文件: #gcc -o test.exe test.cpp -lstdc++

java c混合编程 linux_linux下C与C++混合编程相关推荐

  1. java编程 linux_Linux下java编程

    一.如何编译程序 1.mkdir hello,cd hello vi HelloWorld.java public class HelloWorld{ public static void main( ...

  2. java怎么随机的落下球_java入门程序编程题,一球100米自由落下编程

    下面要给大家带来的是一道非常经典的java入门编程题,一起来看看题目,以及解题的思路方法吧. 一.题目 100米高度自由落下,每次落地后反跳回原高度的一半,再落下. 求: 它在 第10次落地的时候,一 ...

  3. 一文带你深入理解【Java基础】· 面向对象编程(下)②代码块、final和abstract

    写在前面 Hello大家好, 我是[麟-小白],一位软件工程专业的学生,喜好计算机知识.希望大家能够一起学习进步呀!本人是一名在读大学生,专业水平有限,如发现错误或不足之处,请多多指正!谢谢大家!!! ...

  4. java frame linux_JAVA环境(下) - Android框架简介_Linux编程_Linux公社-Linux系统门户网站...

    上节讲到了JAVA框架代码和应用程序的关系,那么框架代码和驱动层是怎么联系的呢?这就是这一节的内容:JNI java使用一种叫做jni的技术来支持对C/C++代码的调用,在anroid中jni的代码放 ...

  5. java程序设计编程题_20165237 2017-2018-2 《Java程序设计》第十周考试补做及编程题...

    20165237 2017-2018-2 <Java程序设计>第十周考试补做及编程题 知识点 1.链表是由若干个称作节点的对象组成的一种数据结构,每个节点含有一个数据和下一个节点的引用 . ...

  6. java读取frp_【原创】FRP初探(函数式编程部分)

    前言 我之前上学时和工作中所接触的编程语言,C++.Java.Objective-C,全部都是面向对象的语言,直到学习了Swift. 通过学习和在App中的实践,感觉Swift跟我们以前常用的Obje ...

  7. 混合云模式下 MaxCompute + Hadoop 混搭大数据架构实践

    摘要:2019杭州云栖大会大数据企业级服务专场,由斗鱼大数据高级专家张龙带来以 "混合云模式下 MaxCompute+Hadoop 混搭大数据架构实践" 为题的演讲.本文讲述了从 ...

  8. linux下spark的python编辑_Linux下搭建Spark 的 Python 编程环境的方法

    Spark编程环境 Spark 可以独立安装使用,也可以和Hadoop 一起安装使用.在安装 Spark 之前,首先确保你的电脑上已经安装了 Java 8 或者更高的版本. Spark 安装 访问 S ...

  9. 基于Java技术的Web环境下分布式数据库互操作性的实现

                作者:李炽明 莫倩 徐明 1 JDBC工作原理 JDBC(Java Database Connectivity)是1个Sun公司注册了的商标,代表用来执行SQL语句的Java语 ...

最新文章

  1. Sprint(第一天11.14)
  2. 【分解质因数】【树状数组】【快速幂】codeforces 2014 ACM-ICPC Vietnam National Second Round E. ACM...
  3. 算法问题拓展——kadane算法及其二维数组的扩展
  4. TestNg依赖详解(三)------灵活的文件配置依赖
  5. 设置数字范围的html语言,JavaScript奇技淫巧44招【实用】
  6. 求求你,别再用wait和notify了!
  7. Kubernetes 部署 Ingress 控制器 Traefik v2.1
  8. mysql导入_导出命令_MySQL导入导出命令
  9. UI设计灵感|移动应用的数据表盘都是怎么设计的?
  10. 51Nod-1083 矩阵取数问题【DP】
  11. 系统学习深度学习(三十)--Deep Q-Learning
  12. UITableVIew与UICollectionView带动画删除cell时崩溃的处理
  13. 管理win7开机启动项
  14. smote算法_探索SMOTE算法
  15. tplink迷你路由器中继模式_TP-Link TL-WR708N迷你无线路由器中继模式怎么设置
  16. 地铁运营行车组织方式
  17. CSS calc()函数的用法
  18. picker插件 vue 移动端_基于 vue 的 picker 组件 vue-awesome-picker
  19. 2016暑假集训总结
  20. 重测信度及常见评价方法

热门文章

  1. Matlab常见问题处理——错误使用 xlswrite (line 219),调用错误,调度异常: 参数错误。
  2. 【java】多线程控制(二)- - -线程池
  3. Python 自动化,Helium 凭什么取代 Selenium?
  4. Python操作MySQL(一)
  5. ReportViewer教程(9)-给报表增加页打印日期编号
  6. 【opencv学习】透视变换矩阵
  7. 《pytorch》对CIFAR数据集的分类
  8. Unable to load configuration的解决方法
  9. c语言程序女设计教学效果分析,C语言程序设计的教学论文
  10. Python中表示自然底数与浮点数精度(等效于MATLAB中eps)