C++ 调用C语言、extern "C"、__cplusplus关键字

——C++编译器完全兼容C语言的编译方式。(但是得有源代码)

——C++编译器会优先使用C++的编译方式进行编译

——extern "C" 关键字能够强制C++编译器进行C方式的编译

  学习目标:实现C语言与C++之间的互相调用

       学习 extern "C" {} 关键字

       学习 __cplusplus标准宏

实验一、通过C++调用C编译器编译出来的   .o  文件 (extern "C" 关键字使用)

  1、创建文件:add.c    

int add(int a,int b)
    {
        return a+b;
    }  

  2、创建:add.h  

int add(int a,int b);//对函数进行声明

  3、使用C编译进行add.c 进行编译 gcc -c add.c -o add.o 生成.o文件   nm add.o //add.o中的符号表信息 

0000000000000000 T add

  4、创建:main.cpp  

  #include <stadio.h>
    #include "add.h"
    int main(int argc, char *argv[])
    {
        printf("Begin...\n");
        int c = 0;
        c = add(10,20)
        printf("c = %d\n",c);
        printf("End...\n");
        return 0;
    }

  5、编译:g++ main.cpp add.o

  输出错误信息:
/tmp/cc6HoeKB.o: In function `main‘:
main.cpp:(.text+0x2d): undefined reference to `add(int, int)‘
collect2: error: ld returned 1 exit status

  从上面错误可以看出 add 这个函数是没有定义的。

  6、修改main.cpp 使用关键字  extern "C" {需要编译器进行C方式编译的部分}  

  #include <stadio.h>
    extern "C"
    {
        #include "add.h"
    }
    int main(int argc, char *argv[])
    {
        printf("Begin...\n");
        int c = 0;
        c = add(10,20)
        printf("c = %d\n",c);
        printf("End...\n");
        return 0;
    }

  

  编译:g++ main.cpp add.o
  编译成功。
  运行结果:  

  Begin...
  c = 30
  End...

 

实验2 _Cplusplus关键字使用,__cplusplus关键字 是C++编译器内置的标准宏定义

  确保C代码能够以统一的方式被编译成目标文件。  

#include <stdio.h>
#ifdef __cplusplus //如果 __cplusplus被定义 ,__cplusplus只有C++中才有 成立则表示为C++编译器
                    //使用__cplusplus来判定是否需要将  extern "C"{}加入到编译中来。实现同一段代可以使用C、C++编译器编译
extern "C"
{
#endif 

    #include "add.h"

#ifdef __cplusplus
}
#endif 

int main(int argc, char *argv[])
{
    printf("Begin...\n");
    int c = 0;
    c = add(10,20);
    printf("c = %d\n",c);
    printf("End...\n");
    return 0;
}

  注意:C++编译器不能以C的方式来编译重载函数。

      编译方式决定函数名被编译后的目标名(C 目标名.o  C++ .oo)

      C++编译方式将 函数名  参数列表  编译成  目标名

      C编译方式只将 函数名 作为目标 (所以对应上了C++编译器不能以C的方式来编译重载函数。这句话)

实验三、使用C来调用C++编译的目标文件(.oo)

    1、创建add.cpp    

#include "add.h"

int add(int a,int b)
{
    return a+b;
}

  2、创建add.h头文件  

#ifdef __cplusplus//如果是C++编译器
extern "C"{//下面部分使用C语言的编译方式进行编译
#endif 

int add(int a,int b);
#ifdef __cplusplus
}
#endif

  3、编译add.cpp 目标文件 g++ -c add.c -o add.oo

  4、创建main.c    

#include <stdio.h>
#include "add.h"

int main(int argc, char *argv[])
{
    int c = 0;
    printf("Begin...\n");
    c = add(10,20);
    printf("c = %d\n",c);
    printf("End...\n");
    return 0;
}

  5、编译C程序生成.out 文件  gcc main.c add.oo

  6、运行结果:  

Begin...
c = 30
End...

小结:

  使用C语言来调用C++关键还是在 extern "C" {} 关键字。强制C++编译器使用C语言的方式来编译{}内的代码。

  只有C++编译出来的文件支持C语言调用才行。

原文地址:https://www.cnblogs.com/hjxzjp/p/11605258.html

时间: 2024-11-06 17:53:53

C++ 调用C语言、extern "C"、__cplusplus关键字的相关文章

JAVA调用C语言写的SO文件

JAVA调用C语言写的SO文件 因为工作需要写一份SO文件,作为手机硬件IC读卡和APK交互的桥梁,也就是中间件,看了网上有说到JNI接口技术实现,这里转载了一个实例 1 // 用JNI实现 2 // 实例: 3 4 // 创建HelloWorld.java 5 class HelloWorld 6 { 7 private native void print(); 8 public static void main(String[] args) 9 { 10 new HelloWorld().p

黑马程序员-C语言基础一:关键字、标识符、注释

------<a href="http://www.itheima.com" target="blank">Java培训.Android培训.iOS培训..Net培训</a>.期待与您交流! ------- 一.      关键字 1.      什么是关键字 1>     关键字就是C语言提供的有特殊含义的符号,也叫做“保留字” 2>     C语言一共提供了32个关键字,这些关键字都被C语言赋予了特殊含义 auto doubl

C语言入门:03.关键字、标识符、注释

一.学习语法之前的提醒 (1)C语言属于一门高级语言,其实,所有高级语言的基本语法组成部分都是一样的,只是表现形式不太一样 (2)就好像亚洲人和非洲人,大家都有人类的结构:2只 手.2只脚.1个头,只是他们外表不太一样,比如肤色.脸型 (3)因此,你掌握好了一门高级语言,再去学习其他高级语言,那是相当快的 (4)而且,很多其他高级语言,比如后面要学习的Objective-C,都是基于C语言.从C语言衍生出来的,好好学习C语言吧,绝对不吃亏 二.关键字 1.什么是关键字 (1)关键字就是C语言提供

在Windows Phone项目中调用C语言DLL

在Windows Phone项目中调用C语言写的DLL 最近接到一个需求,需要在WP里调用一个C语言写的DLL,并且说Android和iOS都可以,问我WP是否可以这样? 我说我调研一下,就有了下面的文章. 在传统C# WinForm 里调用Win32 DLL都不容易(可能用惯了C#),要用P/Invoke,然后DllImport什么什么,那WP里不是更麻烦? 先看看网上有没有可用的文章,结果还真找到devdiv中的文章,但其中有两处错误,所以我fix bug并且整理一下,然后展示给大家. 1.

C# 动态语言特性,dynamic 关键字研究

原文:C# 动态语言特性,dynamic 关键字研究 1       动态语言简介 支持动态特性的语言现在大行其道,并且有继续增长的趋势.比如 Ruby 和 Python, 还有天王级的巨星 --- JavaScript. 现在一个程序员说自己对 JavaScript 根本没使用过,别人一定把你当成从火星回来的吧! 很多使用过 JavaScript 的程序员,刚开始对其动态特性深恶痛绝,欲除之而后快,但是一旦熟悉这个语言以后,又会发疯般的爱上她(我的野蛮女友). 以创建一个“人”为例, Java

Linux汇编GAS调用C语言函数实例

Blum的书上只讲了C语言调用汇编,没讲汇编调用C语言.我自己尝试了下. 最终试验成功了,在此写出与大家分享.期间历经无数错误,无数异常,我不是醉了,而是跪了...好在最后好了. 程序实现一个换值功能,在main.s里定义a=10,b=20,然后调用C语言函数把a,b换值. 新建两个文件分别为main.s的汇编文件,还有pro.c的C语言函数文件. main.s的代码如下: .section .data a: .int 10 b: .int 20 .section .text .globl ma

ARM汇编的一般形式和汇编调用C语言

.text //代码段.global _start //表明程序入口_start: //入口函数 BL main //跳转到c语言中的main,不一定要转跳到main,也可以执行其他的汇编指令 一般工程中,纯汇编复杂,而且效率比C语言并没有提高多少,所以在没有操作系统的工程中,最好的开发方式就是用汇编调用C语言,使用C语言来完成所需要的工作(只有在对效率要求极高的时候才会使用汇编编写代码块),当然裸机开发没有现成的库,就算是简单的printf函数也是没法调用的,其实就是就是汇编的高级语言版本.个

lua调用C语言

在上一篇文章(C调用lua函数)中,讲述了如何用c语言调用lua函数,通常,A语言能调用B语言,反过来也是成立的.正如Java 与c语言之间使用JNI来互调,Lua与C也可以互调. 当lua调用c函数时,使用了和c调用lua中的同一种栈,c函数从栈中得到函数,然后将结果压入栈中.为了区分返回结果和栈中的其他值,每一个函数返回结果的个数. 这里有个重要的概念:这个栈不是全局的结构,每个函数都有自己的私有局部栈.哪怕c函数调用了lua代码,lua代码再次调用该c函数,他们有各自独立的局部栈.第一个参

C# 调用R语言

在.net项目中需要调用Matlab生成的DLL,但是在调用过程中报错,截图如下: 在网上搜索一下资料,看到该博客:https://cn.mathworks.com/matlabcentral/newsreader/view_thread/282351 知道了我调用的DLL中有Matlab工具箱里面的函数,Matlab不允许某些工具箱中的工具被封装成DLL,于是就出现了上图所示的错误. 然后想用R语言实现. 1.先下载R软件:http://mirrors.opencas.cn/cran/,选择b