extern对于外部全局变量是有作用,但不能说对于局部变量有作用,而是对作用域(全局/局部)有作用;
static既对于全局变量有作用,又对于局部变量有作用;
static对于局部变量的作用比较容易理解;
extern只能去声明引用外部源文件的全局变量/函数,但是这个extern声明语句可以放在任意位置(全局/局部);
所以只分析extern和static分别对全局变量的作用;
什么是源文件(*.c/*.cpp),什么是头文件(*.h/*.hpp),两者不一样;
(1)以下四种放在全局位置的包含变量的语句:
extern int v;//声明去引用外部源文件的全局变量(可以写任意多次)
int v;//定义本文件的变量(只能写一次)
int v = 8;//定义本文件的变量(只能写一次)
extern int v = 8;//声明去引用外部源文件的变量并且定义(如果外部源文件没有v的定义,那么编译无错,否则就是重定义);
第四种语句就是鸡肋,所以有warning:
(2)以下四种放在全局位置的包含函数的语句:
extern int fun(int a);//声明去引用外部源文件的全局函数(可以写任意多次)
int fun(int a);//声明去引用外部源文件或者声明本文件的函数(可以写任意多次)
int fun(int a){........}//定义本文件的函数(只能写一次)
extern int fun(int a){........}//鸡肋warning;
(3)static对于全局变量的修饰
静态全局变量,只能在本源文件内使用,不能在其他源文件中extern使用;
解决重名问题,如果没有static修饰符,那么整个程序的所有源文件都不能使用相同名字的量;
源文件.c.cpp不是头文件.h.hpp;
#include "abc.h"只是简单的复制abc.h的内容到语句的位置而已,和直接把abc.h的内容写下来没有区别;
(4)例子:
源文件1:demo.cpp
//demo.cpp
#include <iostream>
using namespace std;
//stafun with the same name as the other src's static function, that's ok.
int stafun(int a)
{
cout << "main fun\n";
}
extern int extt;
extern int extfun(int a);
//extern int stat; //error
//extern int stafun; //error
int main()
{
extt++;
extfun(6);
stafun(6);//call main fun
return 0;
}
源文件2:d2.cpp
//d2.cpp
#include <iostream>
using namespace std;
i