zoukankan      html  css  js  c++  java
  • 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...
    ");
            int c = 0;
            c = add(10,20)
            printf("c = %d
    ",c);
            printf("End...
    ");
            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...
    ");
            int c = 0;
            c = add(10,20)
            printf("c = %d
    ",c);
            printf("End...
    ");
            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...
    ");
        int c = 0;
        c = add(10,20);
        printf("c = %d
    ",c);
        printf("End...
    ");
        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...
    ");    
        c = add(10,20);
        printf("c = %d
    ",c);
        printf("End...
    ");
        return 0;
    }

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

      6、运行结果:  

    Begin...
    c = 30
    End...

    小结:

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

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

  • 相关阅读:
    如何实现冒泡排序
    每天一个JS 小demo之原生数组splice方法书写。主要知识点:锻炼思维逻辑能力,对于数组方法的理解和各种情况的考量
    每天一个JS 小demo之日历制作。主要知识点:日期函数和对于函数封装的灵活运用
    每天一个JS 小demo之商品下架特效制作,主要知识点:定时器,倒计时,抖动特效。
    Html5语义化标签详解及其兼容性处理
    asp.net mvc 遍历linq to sql 多表联查
    将ASP.NET 数据导出到execl
    Microsoft SQL Server 2008 R2附加数据库报错5120解决办法
    十进制、二进制、八进制、十六进制互相转换
    结构体数组的增删改查
  • 原文地址:https://www.cnblogs.com/hjxzjp/p/11605258.html
Copyright © 2011-2022 走看看