`
CJxixi
  • 浏览: 107432 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

linux下C与C++混合编程

 
阅读更多

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

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

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

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 <stdio.h>

#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

正确的编译方法:

            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

正确写法2

正确写法3

其中正确写法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++

分享到:
评论

相关推荐

    linux C与C++混合编程通用makefile

    支持Linux 下 C与C++混合编程的makefile 。

    QML 和C++混合编程宝典.zip_C语言能实现gui编程吗

    通过"QML与C++混合编程.docx"和"QML与C++混合编程.pdf"这两份文档,读者可以深入理解QML和C++的协同工作原理,学习如何在实际项目中有效地运用这两种技术。无论是初学者还是经验丰富的开发者,这份资料都将提供宝贵...

    Linux-C语言编程宝典.rar_C语言_LINUX c++ 编程_linux_linux c++_linux 编程

    读者可以学习到如何在Linux环境下使用C++的类、模板、异常处理等特性,以及如何利用C++与C语言接口进行混合编程。 此外,书中可能还包含了实践案例和调试技巧,帮助读者在遇到问题时能有效地定位和解决问题。例如,...

    C++和Java混合编程

    在本场景中,我们关注的是C++和Java的混合编程,这是一个常见的需求,尤其是在需要利用C++的高性能特性和Java的跨平台优势时。本文将深入探讨C++和Java混合编程的关键知识点,包括互操作性、接口设计、编译配置以及...

    matlab与c++混合编程

    本资源“matlab与c++混合编程”聚焦于如何将这两种强大的工具结合使用,以便充分发挥各自的优势。MATLAB以其强大的数学计算和数据分析能力闻名,而C++则以其高效性和灵活性见长。下面我们将深入探讨混合编程的关键...

    基于Linux c/c++ 混合编程的 共享单车管理系统

    项目技术点: C++语言、linux、文件IO、list链表。 1.实现一个对共享单车的管理的,使用,调度,等等功能的系统。 2.有简单的UI界面,并且完美实现各个界面的循环操作。 3.在单车类,用户类,地区类,管理员类,这四...

    基于Linux的Fortran与C_C 混合编程.pdf

    总的来说,基于Linux的Fortran与C/C++混合编程是一种强大而灵活的技术,它允许开发者在不同语言之间共享代码,结合各自的优势,提高软件开发的效率和质量。对于科学计算和工程领域的开发者来说,掌握这种技术是十分...

    Android操作串口(java与C++混合编程)

    综上所述,"Android操作串口(java与C++混合编程)"涉及到的技术点包括Android NDK的使用、JNI接口的设计与实现、C++中串口通信的系统调用、硬件平台的适配、Java和C++的混合编程、以及权限管理和安全性考量。...

    C和C++嵌入式系统编程_C/C++嵌入式编程_嵌入式_

    2. 混合编程:根据项目需求,可以灵活选择使用C或C++,或者在同一个项目中混合使用两种语言。 四、嵌入式系统编程的关键技术 1. 驱动程序开发:理解硬件接口,编写设备驱动程序,使操作系统能够与硬件通信。 2. ...

    Makefile标准模板,清晰明了,支持c和c++混合编程

    在给定的场景中,`Makefile`支持C和C++的混合编程,这意味着它可以处理`.c`(C语言)和`.cpp`(C++语言)源文件。通常,C++编译器`g++`能够处理这两种类型的源文件,因为C是C++的子集,所以C代码可以在C++环境中编译...

    C、C++、Fortran混合编程研究

    本文旨在探讨C、C++、Fortran三种编程语言在混合编程时的关键技术与注意事项。每种编程语言都有其独特的优势和局限性,通过混合编程的方式可以最大化地发挥各种语言的优点,同时弥补其不足之处。例如,Fortran在数值...

    Linux的C-C++开发.zip

    标签"linux c++"表明这个资源同时涵盖了这两个语言,意味着它可能会介绍如何在Linux环境下混合使用C和C++,比如通过extern "C"来在C++中调用C函数,或者在C程序中使用C++编写的库。 文件名称列表"Linux_C_C-plus-...

    C++游戏编程:创建3D游戏依赖库

    在C++游戏编程中,创建3D游戏是一个复杂而令人兴奋的过程,涉及到多个技术领域和依赖库。3D游戏的开发需要对计算机图形学、物理、音频处理、输入设备控制等多个方面有深入的理解。本篇将围绕“C++游戏编程:创建3D...

    linux环境中c++调用lua动态链接库以及编译方法

    在Linux环境中,C++与Lua交互是常见的技术实践,特别是在...理解这些步骤对于开发涉及C++和Lua混合编程的应用至关重要。正确配置和使用动态链接库,可以让C++充分利用Lua的脚本能力,实现灵活的程序扩展和功能增强。

    Linux平台C_C 和汇编混合编程.pdf

    在Linux平台上,C/C++和汇编语言的混合编程是一种常见的技术,特别是在处理低级操作、性能优化或者直接与硬件交互时。Linux的核心代码大量使用C语言编写,但某些特定部分,尤其是启动代码和需要高效能的部分,通常会...

    基于Python混合编程.pdf

    - 在Linux环境下进行文本检索的实例,利用Python进行混合编程。 - 程序实现了对格式化文本的检索,查找关键字,并提取包含关键字的数据段。 - 程序运行环境包括RedHat 4.4.7-3操作系统、GCC 4.4.7编译器、Python ...

    Ubuntu Linux 下C调用C++类,使用Cmake编译 下载即可编译,gcc g++

    在Ubuntu Linux环境中,将C语言与C++代码集成是一个常见的需求,特别是在既有C代码库,又需要利用C++的高级特性...通过学习和实践这个项目,你可以更好地理解和掌握这些知识点,为未来的C/C++混合编程打下坚实的基础。

    使用C语言调C++的程序例子.rar

    在IT领域,跨语言编程是常见的需求,尤其是在既有C语言代码库又有C++代码库的情况下。本示例探讨了如何在Linux环境下使用C语言调用C++编写的函数。通过这个压缩包“使用C语言调C++的程序例子.rar”,我们可以学习到...

    ARM汇编语言与C_C 语言混合编程实现方法.pdf

    在ARM汇编语言与C/C++语言混合编程中,编程过程中主要包括了ARM汇编语言调用C语言、C语言调用ARM汇编语言等多种方式。ATPCS应用中,汇编语言调用C语言的方式是非常常见的,主要是由汇编语言进行初始化的编程,然后在...

    C++教程网《Linux网络编程》视频百度云地址

    Linux网络编程(总共41集) 讲解Linux网络编程知识,分以下四个篇章。 Linux网络编程之TCP/IP基础篇 Linux网络编程之socket编程篇 Linux网络编程之进程间通信篇 Linux网络编程之线程篇 Linux网络编程之TCP/IP...

Global site tag (gtag.js) - Google Analytics