C++ 程序中可用的存储类:(c++的存储类就是定义 [控制]C++ 程序中变量/函数的范围(可见性)和生命周期)
C++ 不允许同时指定一种存储类以后,只能是每次单独指定一种存储类
- auto
- register(用于定义存储在寄存器中而不是 RAM 中的局部变量)
- static(与java用法一样)
- extern (extern 是用来在一个文件中声明一个已在其它文件中已声明过的全局变量或函数)
- mutable
- thread_local (C++11)
从 C++ 11 开始,auto 关键字不再是 C++ 存储类说明符,且 register 关键字被弃用。
auto 存储类
auto 关键字用于两种情况:声明变量时根据初始化表达式自动推断该变量的类型、声明函数时函数返回值的占位符(返回值类型)。
auto f=3.14; //double
auto s("hello"); //const char*
auto z = new auto(9); // int*
auto x1 = 5, x2 = 5.0, x3='r';//错误,必须是初始化为同一类型
extern 存储类
extern 存储类用于提供一个全局变量的引用,全局变量对所有的程序文件都是可见的。当您使用 'extern' 时,对于无法初始化的变量,会把变量名指向一个之前定义过的存储位置。
当您有多个文件且定义了一个可以在其他文件中使用的全局变量或函数时,可以在其他文件中使用 extern 来得到已定义的变量或函数的引用。可以这么理解,extern 是用来在另一个文件中声明一个全局变量或函数。
extern 修饰符通常用于当有两个或多个文件共享相同的全局变量或函数的时候
A.cpp
#include <iostream>
int count ;
extern void write_extern();//已在下面B文件中定义过了
int main()
{
count = 5;
write_extern();
}
-----------------------------------------------------------------------
B.cpp
#include <iostream>
extern int count;//已在上面A文件中定义过了
void write_extern(void)
{
std::cout << "Count is " << count << std::endl;
}
typedef
typedef的用途: 为已有的数据类型重新命名。
<1. 基本类型>
int a=10;
//为整型重新命名
typedef int ZS;
ZS b=10;
<2. 结构体的使用>
typedef struct Books { char title[50]; char author[50]; char subject[100]; int book_id; }Books;
现在,您可以直接使用 Books 来定义 Books 类型的变量,而不需要使用 struct 关键字。下面是实例:
Books Book1, Book2;
您可以使用 typedef 关键字来定义非结构类型,如下所示:
typedef long int *pint32; pint32 x, y, z;
x, y 和 z 都是指向长整型 long int 的指针。
a. 为结构体重新命名:
//ST---->等价于struct Student
typedef struct Student
{
int id;
char sex;
}ST;
b. 为结构体重新命名(指针类型)
//PST---->等价于struct Student*
typedef struct Student
{
int id;
char sex;
}* PST;
c. 混合使用
//PST等价于struct Student*
//ST等价于struct Student
typedef struct Student
{
int id;
char sex;
}* PST,ST;