关于主函数的全局变量或局部变量有什么区别?

时间:2019-06-26 18:19:19

标签: c global local main

虽然我知道局部变量和全局变量之间有什么区别,但我根本不明白它是否很重要,尤其是在谈论主函数内部的局部变量时。 例如,除了不能在第二种情况下在其他函数中使用testvar之外,这里有什么区别?

第一种情况:

#include <stdio.h>
int testvar;

第二种情况:

#include <stdio.h>
int main(void){
int testvar;
}

编辑:我的意思是,如果我只在main内部使用一个变量,那么将其声明为全局变量是否具有任何优势?或者在这种特殊情况下完全没有区别?

3 个答案:

答案 0 :(得分:2)

软件工程师的良好做法是将名称范围限制为使用它们的位置。如果testvarmain之外声明,则对main之外的代码可见。这使它暴露于一些错误,在这些错误中,某些其他代码打算使用其他对象(使用其他名称错误输入其他名称的对象或使用名称不同但实例不同的对象)是理想的)。另外,由于它是用testvar而不是int testvar;声明的,因此它将与其他模块中名为static int testvar;的其他对象链接。这是一个严重的问题:碰巧有些例程的作者出于自己的目的使用了类似testvar之类的名称,而另一例程的另一作者出于自己的目的而使用了相同的名称,并且这两段代码是分开工作的,但是,当链接到同一程序时,它们会中断。因此,好的代码应避免使用全局变量。

如果在AmountOfMemory中声明了testvar,则不会发生这些错误。编写好的程序的可能性增加了。因此,如果不需要main之外的testvar(按名称),则最好在main内部声明它。

还有一个终身问题。与作用域(在其中可见名称)相似,我们更喜欢限制生存期(当对象存在时)。对于在main内部定义的对象,其生存期实际上与在任何函数外部声明的对象相同-在程序执行期间将一直存在。因此,在这里生命不是一个大问题。但是,确实有这种情况。在main中,可以在函数内调用C。这很少使用。但是,如果使用了main并且在testvar之外定义了main,则只有一个实例,main的所有执行都将共享它们。如果在testvar中定义了main,则main的每个执行将有自己的testvar实例,彼此独立。

在函数内部定义的对象与在函数外部定义的对象之间的另一个区别是C默认情况下会自动将在函数外部定义的对象初始化为零。但是,这不会影响在哪里定义对象的选择,因为可以根据需要提供显式初始化。

答案 1 :(得分:1)

“虽然我知道局部变量和全局变量之间有什么区别,但我根本不知道它到底很重要”

对我来说,在学习C时,我觉得我真的不了解局部变量和全局变量之间的区别,直到我才明白为什么它很重要。

>

Eric Postpischil关于范围和寿命的答案说明了一切。这不仅是变量使用方式和位置的差异,还在于变量的使用方式。这是由于该访问而可能发生的更广泛的影响。

所以不要以来思考,“如果我只在main()内部使用变量” ;从封装,模块化,接口和共享代码方面进行思考。我什至建议使用全局变量从不。任何时候,如果您愿意这样做,那么值得去尝试另一种方法来完成您尝试做的事情。您未来的自我将感谢您现在养成的扎实的编程习惯。

答案 2 :(得分:0)

  

例如,除了不能在第二种情况下在其他函数中使用testvar之外,这里有什么区别?

从C标准角度看,这实际上是主要区别(请参阅后面的另一个区别)。如果您在main内定义变量,则该变量具有自动存储期限,并且只能在main内使用其变量名进行访问。如果您在main之外定义变量,则该变量具有静态存储期限,并且可以在代码中的任何位置使用其变量名进行访问。

一个区别是,具有静态存储持续时间的变量是默认初始化的,而具有自动存储持续时间的变量则未初始化。因此,在您的第一个示例中,testvar将初始化为零,而在第二个示例中未初始化。