zoukankan      html  css  js  c++  java
  • 关于extern的说明

    extern的作用:
    extern可置于变量或者函数前,以表示变量或者函数的定义在别的文件中,提示编译器遇到此变量和函数时在其他模块中寻找其定义。
     
    声明外部变量
    现代编译器一般采用按文件编译的方式,因此在编译时,各个文件中定义的全局变量是互相不透明的。也就是说,在编译时,全局变量的可见域限制在文件内部。但是到了链接阶段,要将各个文件的内容“合为一体”,因此,如果某些文件中定义的全局变量名相同的话,在这个时候就会出现重复定义的错误。
     
    extern的原理很简单,就是告诉编译器:“你现在编译的文件中,有一个标识符虽然没有在本文件中定义,但是它是在别的文件中定义的全局变量,你要放行!”
     
    >>>内核中extern inline的理解<<<
    1.inline是一个编译优化选项,需要满足一定的条件才会达到优化的目的,即直接在调用时展开,而省去调用函数的开销。对于gcc 是-O。
     
    2.static inline表明这个函数只在本编译单元中可见。inline或者extern inline都意味着此函数是全局可见的;不同的是inline限定的函数在定义的编译单元中被直接展开,而在其它调用关系的编译单元中被直接函数调用, 而extern inline限定的函数在所有的调用中都被直接展开,相当于宏展开,强行的函数调用无效,除非定义一个非extern inline限定的版本放在库中以供调用,所以这个extern表明这只是个声明, 如linux-0.1x版本中的strcpy函数, 在include/string.h的定义为:
    // 实际是个宏, 会在所有编译单元中展开
    extern inline char * strcpy(char * dest,const char *src)
    {
    __asm__("cld "
        "1: lodsb "
        "stosb "
        "testb %%al,%%al "
        "jne 1b"
        ::"S" (src),"D" (dest):"si","di","ax");
    return dest;
    }
    在lib/string.c中, 将extern和inline定义为空, 并再次包含了include/string.h, 相当于定义了一个非extern, 非inline的函数:
    #define extern
    #define inline
    #define __LIBRARY__
    #include <string.h>
  • 相关阅读:
    extern "C"
    getchar、putchar、puts、gets
    C语言中整形数组、字符数组、字符串的区别
    fuser:command not found
    pstree:command not found
    三、spring中高级装配(1)
    二、spring中装配bean
    一、认识spring框架
    计算机系统的硬件组成
    在计算机中简单的hello程序的运行
  • 原文地址:https://www.cnblogs.com/black-mamba/p/4423403.html
Copyright © 2011-2022 走看看