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

  • 相关阅读:
    python调用WebService遇到的问题'Document' object has no attribute 'set'
    jquery AJAX 拦截器 success error
    js 钩子(hook)
    js 继承
    js Object的复制
    js关于 indexOf
    js重排序,笔记
    js类型检测,笔记
    jquery源码的阅读理解
    Windows IPC 连接详解(转)
  • 原文地址:https://www.cnblogs.com/hjxzjp/p/11605258.html
Copyright © 2011-2022 走看看