`
CJxixi
  • 浏览: 104437 次
  • 性别: 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 。

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

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

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

    Qt在当下嵌入式开发中越来越热,而QML的引入,开辟了界面和功能解耦开发的先河,这份资料系统介绍了Qt 和QML开发技术,详细说明了C++ 和QML如何交互,推荐给大家一起学习。

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

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

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

    更多请参考我的链接:http://blog.csdn.net/haohaojian/article/details/54630572

    C/C++混合编程之extern “C”的使用示例

    本文主要给大家介绍了关于C/C++混合编程extern “C”使用的相关内容,分享出来供大家参考学习,下面话不多说了,来一起看看详细的介绍吧。 首先要明白: C++号称是C语言的超集,也确实,从语言的基本语法上,C++是...

    [免费]2018年C++教程网的linux网络编程视频百度云下载链接.rar

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

    c++教程网的linux网络编程视频下载

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

    C++教程网视频:linux网络编程

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

    2018年C++教程网的linux网络编程视频共41集百度云下载链接.rar

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

    C和C++混合编程问题

    /*=======sum.c=========*/ #include sum.h int sum(int a,int b) { int c=a+b; return c; } /*====main.cpp======*/ #include sum.h void mian(){ cout &lt;&lt; sum(1,2)&lt;&lt;endl; } 调用以上三个文件,编译...

    硬盘狗程序,硬盘保护(c和汇编混合编程)

    硬盘狗程序,硬盘保护(c和汇编混合编程),硬盘狗程序,硬盘保护.

    asm.tar.gz_linux c 调用asm_汇编

    at&t汇编与c++混合编程的代码,描述了C++单独调用AT&T汇编

    Qt5.9 c++开发指南.zip

    7. 本书虽然主要介绍的是Windows平台上的Qt C++编程,但是所涉及的Qt C++类的用法在Linux、macOS、嵌入式等平台上也是一样的。 本书适合于具有C++语言基础,想要学习Qt C++,并准备用Qt C++编写应用软件的读者。

    浅谈Python程序与C++程序的联合使用

    总之,我们使用Python与C++的混合编程能够加快程序热点的运算速度。 首先要提醒大家注意的是,在考虑联合编程之前一定要找到程序运行的热点。简单一点地,使用标准库的profile或者cProfile模块找到最消耗CPU的位置,...

    汇编语言教程 (王爽)

    1、简明x86汇编语言教程(1)-汇编语言简介 2、简明x86汇编语言教程...10、ARM中C和汇编混合编程及示例 11、VC7中汇编和C++混合的初步心得 12、Linux下的汇编程序设计 13、如何学习汇编语言 14、汇编语言超浓缩教程

    自己写的音频sdk,包含解码编码以及音效

    gaudio - 2.0.6.0是一个基于C/C++混合编程的跨平台音频库,当前支持windows32操作系统和linux32位操作系统

    MATLAB Mixed Programming

    介绍了MATLAB与其他语言混合编程的方法,包括在MATLAB中以文件方式导入、导出数据;在windows和linux开发C/C++的MEX文件;在MATLAB中使用动态连接库文件等。

    C#科学计算讲义

    附录B 动态链接库与混合编程  B.1 静态链接库与动态链接库  B.2 C#调用Fortran动态链接库范例  B.3 调用可执行函数  附录C Linux下C#开发与跨平台编程介绍  C.1 Mono简介  C.2 Linux下C#IDE开发范例  ...

    OpenMC集成DAGMC-Linux-centos7.9系统下离线编译源包及对应的三方库包

    OpenMC 的独特功能之一是其丰富、可扩展的 Python 和 C/C++ 编程接口,支持编程预处理和后处理、多组横截面生成、工作流自动化、耗尽计算、多物理场耦合以及几何图形和计数的可视化结果。除了核心的 Monte Carlo ...

Global site tag (gtag.js) - Google Analytics