C++ 静态变量 全局变量 const

全局数组 不能被delete;

作用域:区分名字的不同意义的上下文。

C++中大多数作用域是用花括号界定的,名字从其声明点到声明所在作用域结束处都是可见的。

#include <iostream>

int main()

{

  int sum=0;

  for(int val=1;val<10;val++)

  sum++;

  return 1;

}

名字main在花括号外,在整个程序都可见。定义在所有函数外部的名字 具有 全局作用域(global scope)。

sum 有局部作用域(local scope) 。就算在头文件中有局部变量的 extern声明,也不是全局变量,不能被其他文件使用。

val只在for语句中使用 , 有 语句作用域(statement scope)。

全局变量 ,又称 外部变量, 在编译时,全局变量对文件内部可见,链接后,(编译产生的obj文件被合并到一起)全局变量的可见范围被扩大到了整个程序。

所以文件中定义的全局变量若 重名的话,会在链接时出现重复定义的错误。

但是由于编译器的目光不够长,编译阶段全局变量可见域只在文件中,所以全局变量不能在程序的任何地方被使用,这就用到了extern 来声明一个变量。告诉编译器:“你现在编译的文件中,有一个标识符虽然没有在本文件中定义,但是它是在别的文件中定义的全局变量,你要放行!”

extern 关键字作用于局部变量 没有效果。

extern “C”

C++环境下使用C函数的时候,常常会出现编译器无法找到obj模块中的C函数定义,从而导致链接失败的情况,应该如何解决这种情况呢?

答案与分析:

C++语言在编译的时候为了解决函数的多态问题,会将函数名和参数联合起来生成一个中间的函数名称,而C语言则不会,因此会造成链接时找不到对应函数的情况,此时C函数就需要用extern “C”进行链接指定,这告诉编译器,请保持我的名称,不要给我生成用于链接的中间函数名。

const :

const in defaultsize=30;//定义defaultsize为常量,初始化为30。defaultsize是一个不可修改的左值。 因为不可修改,所以定义时必须初始化。

const 对象默认为文件的局部变量。

在全局作用域中定义非const变量时,在整个程序中都可以访问。

int counter;//file1.cpp 定义在全局作用域的全局变量。非const变量默认为extern

extern int count;//file2.cpp 声明

++counter;// file2.cpp使用。

在全局作用域声明的const的对象是定义该对象的文件的局部变量。 只能在那个文件中使用,不能被其他文件访问。

通过extern制定const变量为extern(定义时),就可以在整个程序中被访问。

extern const int defaultsize=30;//file1.cpp定义

extern const int defaultsize;//file2.cpp 声明