zoukankan      html  css  js  c++  java
  • C++学习之extern "C"

    我们知道,extern关键字可以置于变量或者函数前,以标示变量或者函数的定义在别的文件中,提示编译器遇到此变量和函数时在其他模块中寻找其定义。这里起到的是声明作用范围的用处。另外,extern还可以与”C”连用,作为链接指示。

    一、C++名字修饰(Name Mangling)

    这就要从C++的重载说起了,在C++中函数重载指的是几个函数的函数名相同,参数列表不同。那么当生成obj中间文件/目标文件的时候,C++编译器如何区分这几个重载函数呢?——通过把原函数名与参数信息结合,产生一个独特的内部名字,这种技术叫做名字修饰(Name Mangling)。名字修饰规则没有一个标准,所以不同的编译器的名字修饰规则也不一样。

    下面是一组函数,其中f()函数重载了:

    int  f (void) { return 1; }
    int  f (int)  { return 0; }
    void g (void) { int i = f(), j = f(0); }
    f(void)和f(int)是不同的函数,除了函数名相同以外没有任何关系。当生成obj目标文件时,为了区分它们,C++编译器根据参数信息进行了名字修饰:

    int  __f_v (void) { return 1; }
    int  __f_i (int)  { return 0; }
    void __g_v (void) { int i = __f_v(), j = __f_i(0); }
    注意g()也被名字修饰了,虽然没有任何名字冲突。名字修饰应用于C++的任何符号。

    二、为什么要使用extern “C”?

    C语言中没有名字修饰(Name Mangling),因为C语言不支持函数重载。但是如果C++中含有C代码,在编译时C++编译器对C代码的函数也会进行名字修饰,函数名变了以后,将导致在C运行库中找不到对应函数,发生链接错误。

    // 将下面的代码保存为.cpp文件,并用C++编译器编译
    int printf(const char *format,...);
     
    int main()
    {
        printf("GeeksforGeeks");
        return 0;
    }
    输出:

    /tmp/ccQBO9Im.o:在函数‘main’中:
    test.cpp:(.text+0xf):对‘printf(char const*, ...)’未定义的引用
    collect2: 错误:ld 返回 1
    为了防止C++编译器对C代码进行名字修饰,我们将C代码用extern “C”进行链接指定,告诉编译器,在生成中间文件时,不要对这部分代码进行名字修饰,而是生成符合C规则的中间符号名。

    extern "C"
    {
    	int printf(const char *format,...);
    }
    
    int main()
    {
    	printf("Hello!");
    	return 0;
    }
    添加了extern “C”链接指示后,上面的代码就能够正常运行了。



    :所有的C风格的头文件(stdio.h, string.h, … 等等)都有在extern “C”下声明,形式如下:

    #ifdef __cplusplus 
    extern "C" {
    #endif
        /* Declarations of this file */
    #ifdef __cplusplus
    }
    #endif




  • 相关阅读:
    百度mp3地址解密码
    VB 在EXE后附加信息
    截屏函数
    Base64和StrToByte
    The Android ION memory allocator, DMABUF is mentioned as well
    DDC EDID 介绍
    Memory management for graphic processors TTM的由来
    科普 写display driver的必看 How video card works [2D的四种主要操作]
    GEM vs TTM
    DMABUF 背景介绍文章 Sharing buffers between devices
  • 原文地址:https://www.cnblogs.com/songlee/p/5738136.html
Copyright © 2011-2022 走看看