美文网首页我用 Linux技术文我爱编程
extern "C"的小结 来自《程序员的自

extern "C"的小结 来自《程序员的自

作者: popsheng | 来源:发表于2015-08-12 22:26 被阅读195次

extern "C"的小结 来自《程序员的自我修养》

  • C++为了与C兼容,C++可以使用关键字extern "C"来声明或者定义一个C符号:

    extern "C"{
        int func(int);
        int var;
    }```
      C\+\+会将extern "C"的大括号内的代码当做C语言代码**(.c文件)**处理,亦即在大括号中C\+\+的名称修饰机制将不起作用,不同的编译器有不同的名称修饰方法:
      1.如果是VC++平台,上述代码中的fun和var会被修饰(名称修饰)为_func和_var;
      2.但是如果是linux下的gcc编译器,前面的_也会被去掉,extern "C"里面的符号就是修饰后符号(为func和var)。
    【补充】gcc编译.c文件,因为是按照c方式编译,所以函数名不变;gcc编译.cpp文件,g\+\+编译.c文件,g\+\+编译.cpp文件,因为是按照c\+\+方式编译,所以函数名才会加上了附加信息。(当前编译器编译出来的目标文件和库文件(目标文件)应该是同样的编译器编译出来的)
    ps:单独声明某个函数或者是变量是C的符号,可以直接
    

    extern "C" int func(int);

  • extern "C"带来的问题
      我们经常遇到这样的情况:有些头文件声明了一些C语言的函数和变量,但是这个头文件可能被C语言或者是C++语言包含。例如:
      对于函数 void memset (void , int, size_t) 而言,如果不使用extern "C"**,考虑一以下两种情况:
      1.在C语言程序包含string.h的时候,如果用到了memset这个函数,编译器会进行正确的函数名称修饰memset(C语言的名称修饰,前面加),也可以正确的连接到C语言库中的memset符号。
      2.在C++程序中包含了memset函数,编译器编译器会认为这是一个C++函数,函数名就会被修饰为_Z6memsetPvii(C++的名称修饰可自行了解),这样的话,链接器就没办法在C语言的库中找到对应的符号地址。此时就必须使用extern "C"。

  • C与C++的兼容问题的实现
    方法是使用C++的宏__cplusplus

    #ifdef __cplusplus
    extern "C" {
    #endif
    // 代码
    #ifdef __cplusplus
    }
    #endif
    

    含义是,如果是C++代码,那么memset会在extern "C"中被声明,如果是C代码就直接声明。

相关文章

  • extern "C"的小结 来自《程序员的自

    extern "C"的小结 来自《程序员的自我修养》 C++为了与C兼容,C++可以使用关键字extern "C"...

  • extern "C"

    C++函数调用C函数 先来看个例子吧,建立一个新的工程,包含三个文件c函数头文件, cExample.h c函数源...

  • extern "C"

    引言 C++保留了一部分过程式语言的特点,因而它可以定义不属于任何类的全局变量和函数。但是,C++毕竟是一种面向对...

  • extern "C"

    extern "C"主要用在c++调用c编写的函数或者相关代码时使用,因为c和c++的函数、变量结构类似,但是编译...

  • 解析extern "C" {}

    前言 在一个xxx.mm文件中,看到如下类似代码 预处理(Preprocess) 源代码变为可执行文件时,会经历四...

  • extern "C"的用法解析

    原文地址: http://www.cnblogs.com/rollenholt/archive/2012/03/2...

  • extern "c"用法解析

    引言 C++保留了一部分过程式语言的特点,因而它可以定义不属于任何类的全局变量和函数。但是,C++毕竟是一种面向对...

  • 关于 C++ 中的 extern "C"

    目录 1. 关于 C++ 中的 extern "C" 1.1. 简介 1.2. 问题的引出 ...

  • 面试题:简述extern"C"的作用。

    extern "C"的目的是实现类C和C++的混合编程。在C++源文件中的语句前面加上extern "C",表明它...

  • extern "C" 关于C++中调用被C编

    详见:https://blog.csdn.net/monroed/article/details/54880944...

网友评论

    本文标题:extern "C"的小结 来自《程序员的自

    本文链接:https://www.haomeiwen.com/subject/yhniqttx.html