【C/C++】static 和 extern

      C语言

        static

        在C语言中 static 主要用于定义全局静态变量、定义局部静态变量、定义静态函数。

        全局静态变量:在全局变量前加上关键字 static ,该全局变量就成了全局静态变量。

        特点:1.存储在静态区中的数据段。

                  2.如果没有初始化,其默认值为0。

                  3.该变量在本文件内从定义开始到文件结束可见,且在外部文件不可见。

       局部静态变量:在局部变量前加上关键字 static ,该局部变量就成了局部静态变量。

       特点:1.存储在静态区中放入数据段。

                 2.它始终驻留在静态区,知道程序运行结束。

                 3.该变量的作用域为局部作用域,当定义它的函数或语句块结束时,其作用域随之结束。

       静态函数:在函数返回类型前加上 static 关键字,函数就被定义为静态函数。

扫描二维码关注公众号,回复: 1873447 查看本文章

       特点:1.静态函数只在本源函数中使用。

                 2.在文件作用域中声明的 inline 函数默认为 static 函数。

       extern

       在C语言中 extern 主要用在变量的声明前、用在函数的声明前、用于指示C/C++的调用规范

       extern修饰变量的声明:用来说明此变量在别处定义,要在此处引用。

      注:若 test.c 中需要引用 test1.c 中的变量 int a ,在 test.c 中声明 extern int a 就可以使用。需要注意的是,被引用变量 a 的链接属性必须是外连接 (external)的,也就是 test.c 中要引用到变量 a ,不仅取决于声明中的 extern ,还取决于变量 a 本身是能够被引用到的。这里涉及到另外一个话题——变量的作用域。能够被其他模块以 extern 引用到的变量通常是全局变量。

       extern修饰函数的声明:用来说明此函数在别处定义,要在此处引用。

      本质上来说,变量和函数没有区别。函数名是指向函数二进制开头处的指针。如果文件 test.c 要引用 test1.c中的函数,比如在 test1.c 中原型是 int func(int m),那么就可以在 test.c 中声明 extern int func(int m),然后就能使用 func() 函数。就像变量的声明一样,extern int func(int m) 可以放在 test.c 中的任何位置,而不一定非要放在 test.c 的文件作用域的范围中。

       对其他模块中函数的引用,最常用的方法是包含这些函数声明的头文件。

      使用 extern 和包含头文件来引用函数的区别

      extern 的引用方式比包含头文件要间接得多。extern的使用方法是直接了当的,想引用哪个函数就用extern声明哪个函数。这大概是kiss原则(懒人原则,换句话来说,简单就是美)的一种体现。这样做的一个明显的好处是,会加速程序的编译(确切地说是预处理)的过程,节省时间。在大型C程序编译过程中,这种差异是非常明显的。

      extern 用于指示C/C++的调用规范:比如在C++中调用C库函数,就需要在C++程序中用extern "C"声明要引用的函数。这是给链接器使用的,告诉链接器在链接的时候用C函数规范来链接。主要原因是C++和C程序编译完成后再目标代码中命名规则不同。

      C++

      static
      在C++中 static 的用法有定义类的静态成员、定义类的静态成员函数。
      类的静态成员:在类的成员变量前加上 static ,该变量就声明为静态成员。
      特点:1.静态成员为所有类对象所共享,不属于某个具体的实例。

                 2.类静态成员可用  类名: :静态成员  或  对象.静态成员  来访问。

                 3. 类的静态成员变量必须在类外定义,定义时不添加 static 关键字。

              4.静态成员和普通成员一样,也有public、protrcted、prixate 3种访问级别,也可以具有返回值,const修饰符等参数。

      类的静态成员函数:在类的函数返回值前加上 static ,该函数就声明为静态成员函数。

      特点:1.类的静态成员函数没有默认this指针,因此在它里面不能使用任何非静态成员

                 (即静态成员之间可以相互访问,包括静态成员函数访问静态数据成员和访问静态成员函数;

                    非静态成员函数可以任意地访问静态成员函数和静态数据成员;

                    静态成员函数不能访问非静态成员函数和非静态数据成员)。

                 2.由于没有this指针的额外开销,因此静态成员函数与类的全局函数相比速度上会有少许的增长。

                 3..出现在类体外的函数定义不能指定关键字static。

                 4.静态成员函数可以继承和覆盖,但不能是虚函数。

      extern 

      .在C++中 extern 的用法有 变量的声明和定义、在多个文件中共享 const 对象。

       变量的声明和定义:C++中支持分离式编译机制,为了支持这个机制,C++允许将声明和定义分离开来。

       声明: extern int a;  

       定义: extern int a =2;  

       注:变量能且只能被定义一次,但是可以被声明多次。

       在多个文件中共享 const 对象:只在一个文件中定义 const ,而在其他多个文件中声明使用者这个文件。

//file1.cpp定义并初始化和一个常量,该常量能被其他文件访问
extern const int bufferSize = function();
//file1.h头文件
extern const int bufferSize; //与file1.cpp中定义的是同一个
       extern一般是使用在多文件之间需要共享某些代码时。

猜你喜欢

转载自blog.csdn.net/xiayzn/article/details/80813767