C\C++备忘录之关键字【static,const,extern】

时间:2021-09-07 15:27:58

static

1.局部变量

// 该变量生命周期不仅仅是进入该函数后,而是整个程序运行期间
void foo()
{
static int nVar = 0;

printf("var = %d\n", ++nVar);
}

2.保护本地变量

static int g_nVar; // g_nVar只能在本文件中使用,其他文件不能通过extern访问该变量

3.静态成员变量

// 该变量不属于对象,而属于这个类
class Foo
{
public:
static int nCount;
};

int Foo::nCount = 0;

int main()
{
cout << Foo::nCount << endl;
return 0;
}

4.静态成员函数

// 该函数不属于对象,而属于这个类
class Foo
{
public:
static void ShowClassTag();
};

void Foo::ShowClassTag()
{
cout << "class Foo" << endl;
}

int main()
{
Foo::ShowClassTag();
return 0;
}

5.静态全局函数

static int ModuleFunc(); // 该函数只有本模块可调用


const

1.定义常量

const int  nItem = 0;
const int* pnItem = &nItem;

2.保护变量不被外部使用

//file1.c
const int g_nLocalVar = 100;
int g_nVar = 100;

//file2.c
extern const int g_nLocalVar; // 非法声明
extern int g_nVar; // 合法

3.表明成员函数不会修改成员变量

class A
{
private:
intage;
charname[32];

public:
voidShowInfo() const;// 表明该函数不会修改类对象
voidSetName(const char* pName);
const char*GetName()const;// 表明该函数不会修改类对象
};



extern

1.声明所引用对象已被定义

extern int g_nFoo;

int main()
{
g_nFoo++;
cout << g_nFoo << endl;
return 0;
}

int g_nFoo = 0;

2.声明该变量可被外部使用

// file1.c
extern const int g_nItem;
int main()
{
cout << g_nItem << endl;
return 0;
}


// file2.c
// 如果此处不加extern,该变量不能被外部访问的
extern const int g_nItem = 100;

3.声明函数的编译连接方式

为了保持兼容性,使得函数的编译连接适用于混合编程,需要在C++的函数声明前添加extern "C"的声明,如下所示:
// C++默认的编译方式,为了支持重载,函数符号名有参数信息类似于 __MyFunc_int
int MyFunc(int n)
{
if(n <= 0)
{
return 0;
}
else
{
return n + MyFunc(n-1);
}
}


// 声明为C风格的编译链接方式,符号名类似于__MyFunc,无参数类型信息
extern "C" int MyFunc(int n)
{
if(n <= 0)
{
return 0;
}
else
{
return n + MyFunc(n-1);
}
}
一般动态链接库的导出函数都是使用这种方式声明,使得C++得导出函数支持C代码调用。