#@date: 2014-06-14
#@author: gerui
#@email: forgerui@gmail.com
Contents
extern的作用一般是用来声音一个外部变量和函数。一般在头文件hello.h中进行extern int a;的声明,在hello.c中进行a = 10;的定义。
-
如果在hello.h中既声明又定义,则会引起一个问题。如,hello.h中定义一个extern int a =2;,hello1.c中#include "hello.h",hello2.c中同样也`#include "hello.h",这样会出现a重定义而报错。所以,一般使用extern声明变量时,不进行定义。如果一定需要进行定义的话,那么hello2.c中的#include "hello.h"语句就要去掉,换成如下语句:
extern int a;
void print(){
cout<<a<<endl;
}这样编译器会自动查找外部a定义的地方。
static在hello.h中声明一个全局static int aa = 1;时一般会同时进行定义,这样在hello1.c中和hello2.c*同使用aa这个变量。
当使用extern C关键词时,表明采用C的格式生成变量或函数名称,因为C++由于重载的函数同名的存在,会在中间生成一个别名。使用extern C时,就不使用别名,直接保留原有的名称。
const char * p,char const * p,char * const p 三者的区别,见博客。const char * p 和 char const * p 等价,都是代表这个p所指向的内容是个常量,不可改变,而 char * const p 则代表p这个指针只能是固定的,不能改变其指向的位置。还有复杂的问题,如 const char ** p、 char * const * p、char const * const * const p ……可以组合出许多种情况。
静态变量或静态函数只有本文件内的代码才能访问它,它的名字在其它文件中不可见。所有未加static前缀的全局变量和函数都具有全局可见性,可以通过extern表明在文件外部查找。如果加了static,将只能在包含的文件中使用。全局变量和静态变量都是静态存储方式,静态变量的作用于当前源文件。
把局部变量改变为静态变量后是改变了它的存储方式即改变了它的生存期。把全局变量改变为静态变量后是改变了它的作用域, 限制了它的使用范围。
-
下面的语句执行时,局部变量的static第一次定义为10,即只初始化一次,其后的定义语句就没有作用了,他会随着循环不断减小,10、9、8、7...、1。而全局的count不受静态的count影响,会随着循环不断增加。
#include <stdio.h>
int fun(void){
static int count = 10; // 事实上此赋值语句从来没有执行过
return count--;
}
int count = 1;
int main(void) {
printf("global\t\tlocal static\n");
for(; count <= 10; ++count)
printf("%d\t\t%d\n", count, fun());
return 0;
} -
整体上,static有以下两个作用:
1)、变量会被放在程序的全局存储区中,这样可以在下一次调用的时候还可以保持原来的赋值。这一点是它与堆栈变量和堆变量的区别。2)、变量用static告知编译器,自己仅仅在变量的作用范围内可见。这一点是它与全局变量的区别。