• 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语言调用才行。

  • 相关阅读:
    正则表达式点滴
    异步处理与界面交互
    关于利用VS2008创建项目遇到的小困惑备忘
    using App.cofig to Store value
    Castle ActiveRecord学习笔记三:初始化配置
    无服务器端的UDP群聊功能剖析
    为VS2010默认模板添加版权信息
    理论有何用?不问“何用”,先问“用否”!
    微软没有公开的游标分页
    那些满脑子只考虑后台数据库的人他整天研究的就是针对自己查询一些数据的sql语句
  • 原文地址:https://www.cnblogs.com/hjxzjp/p/11605258.html
Copyright © 2020-2023  润新知