12 November 2013

一个C语言源文件中,定义在所有函数外的是全局变量,定义在某个函数内的是局部变量。

全局变量在整个程序开始时分配内存并初始化,程序结束时释放。而局部变量在进入函数时分配内存,函数返回时释放。

全局变量默认初始化为0,手动初始化时只能用常量表达式;局部变量默认不会被初始化,需要手动初始化或赋值。

全局变量可以被其所在文件内的所有函数访问,容易出问题,所以应尽量避免使用。例如你在某个函数内定义了一个与全局变量同名的局部变量,那么在这个函数中局部变量名字就会覆盖全局变量。 最终容易搞混淆,徒增麻烦。

当然,若对全局变量有充分的了解,适当的使用也没可以。但使用时还是要有所考虑。

如果全局变量仅在某一个文件中使用,应该为其加上static修饰符。这可以使该变量的名字作用域局限在该文件内。 否则,该变量的名称就是整个程序可见的。这时如果在别的文件也定义了一个同名的全局变量,就会引发编译错误。 同样的道理,如果一个函数也仅在某一个文件中使用,同样应该用static修饰。

编译错误毕竟很容易暴露并被纠正,最危险的是运行时产生错误的结果。在使用全局变量时,一定要特别注意其初始化。如果一段代码执行多次,那么后一次执行时的初值将是第一次执行后留下的值。 如果没有再次赋初值就使用,很可能出问题。

在编写库时,尤其应该避免全局变量。因为一个库的代码可能在同一个程序中运行多个实例。这时由于全局变量只有一个,多份代码实例对同一个全局变量的访问就会冲突。 例如FFmpeg这样的库,就几乎没有用全局变量。取代的做法是将需要“全局访问”的变量放在一个结构体中,然后将这个结构体的指针以参数的形式传给需要的函数。