zoukankan      html  css  js  c++  java
  • C++和C混合编程

    C++比C晚出现,C++代码如果能够调用C语言的代码,那么会更好的利用现有的成果,但是事实上C++代码是无法直接调用C代码的,这是因为C++编译器在编译.cpp文件时生成的函数名与C编译器在编译.c文件时生成的函数名是不一样的。

    C++为了支持重载,其编译器在编译完成后会对原有的函数名进行修改,比如

    test(int i)和

    test(int i, int j)

    这两个函数在编译完成后可能就会被C++编译器修改成:

    _ZDtesti

    _ZDtestii

    这种样式

    但是C编译器却不会修改函数名,这样问题就就来了,如果在一个C++代码中包含一个声明C函数的头文件时,那么很可能在编译完成后,头文件中声明的这个C函数名会被修改!这样在C++代码中使用这个C函数的时候就会发生找不到函数名的问题,事实上这个函数在C代码中是存在的,只不过C++编译器一厢情愿的把函数名修改了。那么如何解决呢?

    2.解决办法

    很简单,显式的告诉C++编译器,这段代码是用C语言编译的函数,你就不要把函数名转化为C++的格式了。

    extern "C" {
    
        int socket_send(); // 明确的告诉C++编译器,这是一个用C语言编译的函数
        
    }

    这样C++编译器在执行这段代码时,识别到extern "C"关键字,就会以C编译器的方式来编译括号内的代码。

    3.由此引发的问题

    这样虽然在C++编译下没有问题了,但是如果一个.c文件再去包含这个头文件时,又会发生问题,因为extern "C"不是C语言的关键字,这样.c文件又不能包含这个头文件了。如何能够既让.cpp文件能够包含这个头文件,又能让.c文件能够包含这个头文件呢,于是下面的写法就产生了:

    使用条件编译的方式,如果判断是C++的编译器,就带上extern "C",如果是C的编译器就不带extern "C",由此,问题得到妥善解决。需要注意的是:__cplusplus是C++编译器内置的宏。

    #ifdef __cplusplus
    extern "C" {
    #endif
    
    .......
    
    
    
    #ifdef __cplusplus
    }
    #endif

    %02x与%2x 之间的区别

    输出最小宽度
    用十进制整数来表示输出的最少位数。若实际位数多于定义的宽度,则按实际位数输出,若实际位数少于定义的宽度则补以空格或0(当最小宽度数值以0开头时)。
    
    X 表示以十六进制形式输出
    02 表示不足两位,前面补0输出;如果超过两位,则实际输出
    举例:
    printf("%02X", 0x345);  //打印出:345
    printf("%02X", 0x6); //打印出:06
    
    而如果直接写为 %2x,数据不足两位时,实际输出,即不额外补0输出; 如果超过两位,则实际输出。
    printf("%2X", 0x345);  //打印出:345
    printf("%2X", 0x6); //打印出:6

    for example

    如:

    Scala

    1.  
      object Test {
    2.  
      def main(args: Array[String]): Unit = {
    3.  
      println("%02X".format(12)) // 0c
    4.  
      println("%02X".format(2)) // 02
    5.  
       
    6.  
      println("%2X".format(12)) // c
    7.  
      println("%2X".format(2)) // 2
    8.  
      }
    9.  
      }

    Java 

    1.  
      public class Test {
    2.  
      public static void main(String[] args) {
    3.  
      System.out.println(String.format("%02X",12 )); // 0c
    4.  
      System.out.println(String.format("%02X",2 )); // 02
    5.  
       
    6.  
      System.out.println(String.format("%2X",12 )); // c
    7.  
      System.out.println(String.format("%2X",2 )); // 2
    8.  
      }
    9.  
      }
  • 相关阅读:
    Hive学习之路 (三)Hive元数据信息对应MySQL数据库表
    Hive学习之路 (二)Hive安装
    Hive学习之路 (一)Hive初识
    MyBatis+Spring SQL效率测试报告
    Java NIO
    Endianess(字节次序)简介
    Maven重复类的解决
    [转]Unicode和UTF-8的关系
    Java IO 体系结构
    建造者模式(Builder)
  • 原文地址:https://www.cnblogs.com/klb561/p/13831445.html
Copyright © 2011-2022 走看看