C++语法-存储持续性、作用域和链接性

《C++ Primer Plus 第6版》第九章学习笔记

存储持续性

自动存储持续性:函数中声明的变量;

静态存储持续性:函数外定义的变量和用static关键字定义的变量;

线程存储持续性:thread_local声明的变量,其声明周期与所在线程相同;

动态存储持续性:new运算符分配的内存,由delete运算符释放,称为自由存储或者堆(heap)。

 

作用域和链接性

作用域描述了名称在文件(翻译单元)的多大范围内可见。

链接性描述了名称如何在不同单元间共享。

当函数中有与全局变量相同名称的变量(如var)时,函数中的变量会隐藏全局变量。在函数可以通过作用域解析运算符“::“访问全局变量(如::var)。

//代码片段
int num = 0;
void doNum()
{
    int num = 11;
    cout << "in doNum()" << endl;
    ::num+=1; //修改全局的num
    cout << "::num = " << ::num << endl; // 输出全局num
    cout << "num=" << num << endl; // 输出函数中的num
}

 

静态持续变量

静态持续变量有3种链接性:

  • 外部链接性:可在其他文件中访问,定义于代码块之外;

  • 内部链接性:只能在当前文件中访问,定义于代码块之外并且使用static限定符;

  • 无链接性:只能在当前函数或者代码块中访问,定义于代码块之内并且使用static限定符。

int global_var = 1; // 外部链接性
static int onefile_var = 2; //内部链接性

void foo()
{
    static int nolink_var = 3; //无链接性
}

所有静态持续变量,如果没有被初始化,则其所有位都被设置为0,即零初始化(zero-initialized)。

每个使用外部变量的文件,都必须声明该外部变量:要在多个文件中使用外部变量,只需要定义该变量一次,在其他使用该变量的文件中必须使用extern对其进行声明。

注意:用extern声明外部变量的时候,不要给其赋值,否则声明就成了定义。

下面代码演示两个cpp文件:rgb_color.cpp中定义了外部链接性的静态持续变量,在main.cpp中用extern声明要用到的外部变量。

//rgb_color.cpp
int color_r = 0xff0000;
int color_g = 0x00ff00;
int color_b = 0x0000ff;
//main.cpp
#include <iostream>
using namespace std;

extern int color_r; //声明外部变量

int main()
{
    cout << "Red:" << hex << color_r << endl;
    
    return 0;
}

在文件中使用static定义内部链接性的静态变量后,在此语句之后的对应变量为该变量,即隐藏了外部同名变量。如果在该语句之前定义了某个函数,且函数中使用extern声明了同名的变量,则在该函数中会使用外部链接性的外部变量。

例如,将上面代码中main.cpp修改如下:

//main.cpp
#include <iostream>
using namespace std;

extern int color_r;

int green()
{
    extern int color_g;//使用外部变量,即0x00ff00;
    return color_g;
}

// - start here, make a difference ...
static int color_g = 32; //定义内部链接性变量;

int green2()
{
    extern int color_g; //仍然使用内部链接性,即32

    return color_g;
}

int main()
{
    cout << "green() = " <<hex << green() << endl; // 0x00ff00
    cout << "Red:" << hex << color_r << endl;//0x20
    cout << "Green:"  << color_g << endl; //<< dec
    cout << "green() = " << green() << endl; // 0x00ff00
    cout << "green2() = " << green2() << endl; //0x20
    return 0;
}

在”static int color_g = 32; //定义内部链接性变量;“这一语句之后,color_g都为32,即0x20,只有green函数中的是外部变量。

const限定符

在C++中,全局变量默认为外部链接性,但const全局变量的链接性为内部的。如果希望某个常量链接性为外部,在定义的时候需要使用extern关键字,在其他使用该常量的文件中要用extern来对其进行声明:

extern const int gloabal_const_data = 100;

函数链接性

默认情况下,函数的链接性为外部,在要使用外部文件定义的函数的文件中,只需声明该函数原型即可,extern关键字为可选。

通过使用static关键字,可以将函数链接性设置为内部,即只能在一个文件中使用。注意,声明和定义中都要用static关键字。

语言链接性

C语言链接:extern "C"

C++语言链接:extern "C++"

以上两者用在函数原型上,指定要使用的约定。

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章