码迷,mamicode.com
首页 > 编程语言 > 详细

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

时间:2019-09-28 23:25:47      阅读:113      评论:0      收藏:0      [点我收藏+]

标签:ror   dash   数列   back   错误信息   定义   color   一段   运行   

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

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

标签:ror   dash   数列   back   错误信息   定义   color   一段   运行   

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

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!