C调用C++(C++封装以及C对其调用)

本文介绍了如何在C语言中调用C++代码,包括C++类的封装以及C调用C++的注意事项,涉及到extern C、函数调用约定和动态库的使用。通过实例展示了C++类如何封装成C接口,并提供了相关代码示例。
摘要由CSDN通过智能技术生成

C调用C++(C++封装以及C对其调用)

来源 https://blog.csdn.net/wonengguwozai/article/details/89854781

 

  相关知识提点:很经典的extern C解释

  编译器:

    gcc和g++编译器区别
      gcc是c语言编译器(也可处理c++);g++是c++编译器
      g++对.c和.cpp文件都当c++处理;gcc对.c文件当作c处理,对.cpp当做c++处理
      g++编译器在使用时其实调用的是gcc编译器
      gcc不能自动链接库文件(.so等),一般用g++来自动链接库文件,要一定使用gcc则需要加上-lstdc++参数(使用libstdc++.so库)
      gcc编译器和g++编译器在编译函数时,在相同调用方式下(如都是用_stdcall),对函数名的修饰方式不一样
    gcc和g++搜索库文件的原则
      头文件如果放在/usr/include/下,库文件放在/lib或/usr/lib或usr/local/lib下编译器会自动发现对应的库
      如果头文件和库文件不在上述位置存放则在编译器编译时需要指定对应依赖的头文件和库文件的位置,否则编译器找不到库文件。指定方式:
        使用-I(大写的i)指定头文件位置
        使用-L指定库文件位置
        使用 -l库名 指定链接的库名
      例子(链接mytest/lib下的libgtd.so库,注意使用-lgtd来指定):g++ test.cpp -o test.txt -L /mytest/lib -lgtd -I /mytest/include
    函数名的修饰:

      含义:函数的名字修饰(Decorated Name)就是编译器在编译期间创建的一个字符串,用来指明函数的定义或原型。LINK程序或其他工具有时需要指定函数的名字修饰来定位函数的正确位置。多数情况下程序员并不需要知道函数的名字修饰,LINK程序或其他工具会自动区分他们。当然,在某些情况下需要指定函数的名字修饰,例如在C++程序中, 为了让LINK程序或其他工具能够匹配到正确的函数名字,就必须为重载函数和一些特殊的函数(如构造函数和析构函数)指定名字装饰。
    几种函数调用约定(__cdecl, __stdcall,__fastcall)

      用法:调用约定说明符放在函数名前,如int __cdecal add(int a, int b);调用约定一定在函数的声明和定义中都指定且需保持一致
      几种调用约定的区别
        函数被调用时参数(尤其形参)的入栈顺序不同
        函数出栈是由调用函数还是由被调函数弹出栈的区别
        函数名的修饰方式不同。函数名的修饰时编译器在编译函数时对函数名进行名称修饰的操作。这对c语言和c++由很大不同,因为c++有同名函数的重载,类的构造和析构函数。
      由于前两种区别由编译器决定,编程者无从干预,所以不再深究。那么对于第三种(函数名的修饰)区别下面主要说明。
    不同编译环境(c和c++环境)下,各调用约定下对函数名修饰原则

      如函数为:int functionname(int a, int b)

        c环境下

          __cdecl对函数名的修饰:__functionname
          __stdcall对函数名的修饰:_functionname@number(number为形参的字节数)
          __fastcall对函数的修饰:@functionname@number(number为形参的字节数)
        c++环境下(为了重载、继承特性)

          以“?”标识函数名的开始,后跟函数名

          如果是__cdecal调用约定,函数名后面接“@@YA”标识参数表的开始;如果是__stdcall调用约定,函数名后面接“@@YG”标识参数表的开始;如果是__fastcall调用约定,函数名后面接“@@YI”标识参数表的开始。

          后面再跟参数表,参数表以代号表示(各代号的含义后面说明),参数表的第一项为该函数的返回值类型,其后依次为参数的数据类型,指针标识在其所指数据类型前;

          参数表后以“@Z”标识整个名字的结束,如果该函数无参数,则以“Z”标识结束。

          参数表代号说明

X--void , 
D--char, 
E--unsigned char, 
F--short, 
H--int, 
I--unsigned int, 
J--long, 
K--unsigned long, 
M--float, 
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值