解释啥是全局变量,如何定义

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了解释啥是全局变量,如何定义相关的知识,希望对你有一定的参考价值。

其实,变量根据其在程序中的定义点不同,分为局部和全局变量。
在函数内部定义的变量为局部变量;
在所有函数外部定义的变量为全局变量。
全局变量的作用域是从该变量定义的位置开始,直至源文件借宿。在同一文件中的所有函数都可以引用为全部变量。

全局变量存储类型一般可以定义为:static型和exterm型,默认为extern型。
而其static型全局变量作用域定义点开始至本源文件内的所有函数,其他源文件内的函数不能使用;extern型全局变量作用域为定义点开始至源文件内的所有函数,同时可以被其他源文件内的函数使用,在使用之前要加外部说明,关键字仍然是extern.
参考技术A Public 声明的就是全局的..简单点说,就是可以被所有窗体里的Sub调用的变量,一般放在标准模块里

转贴内容如下:
VB 共享数据 全局变量

在用VB开发软件时,经常需要在不同的窗体间共享数据,但在过多的使用全局变量时不便于软件的调试和修改。通常有两种解决方法。

第一种方法:定义全局变量,然后在各个窗体中直接使用,例如

Public strCustomerID As String

Public strCustomerName As String

第二种方法:添加一个模块专门用于定义变量,然后定义一些Public过程或函数来设置和获取这些数据,例如

Dim strCustomerID As String

Dim strCustomerName As String

Public Sub SetCustomerID(CustomerID As String)

strCustomerID = CustomerID

End Sub

Public Function GetCustomerID() As String

GetCustomerID = strCustomerID

End Function

Public Sub SetCustomerName(CustomerName As String)

strCustomerName = CustomerName

End Sub

Public Function GetCustomerName() As String

GetCustomerName = strCustomerName

End Function

其实这两种方法都有缺点,使用第一种方法时,当过程或函数中过于频繁的使用全局变量时会给调试和修改程序带来很大的工作量,有时会产生灾难性的后果。使用第二种方法时,若共享数据很多,则需要定义很多的Set*和Get*函数。本回答被提问者采纳

对于在同一类中设置全局变量的例程,啥是好的命名约定

【中文标题】对于在同一类中设置全局变量的例程,啥是好的命名约定【英文标题】:What is a good naming convention for a routine that sets a global variable in the same class对于在同一类中设置全局变量的例程,什么是好的命名约定 【发布时间】:2010-10-20 23:08:53 【问题描述】:

Code Complete(第 7 章,第 3 节)说一个好的函数应该根据它返回的值来命名,而一个类中的一个好的过程名称应该根据它的作用来命名。

当我在 Delphi(2009 年之前)中编写同步方法时,有时我需要使用它们来设置全局变量,这似乎是一种不好的编程习惯,但由于我无法传递变量,因此这是必要的。我不想称它们为“Get”或“Set”,因为我将它们用于我的属性方法。

有人对这些有更好的命名约定吗?

【问题讨论】:

【参考方案1】:

我不想称它们为“Get”或 “设置”,因为我将它们用于我的 属性方法。

这似乎是一个相当武断的决定。您可能还说您不想在“setName”上使用“set”,因为您也在“setAge”上使用过它?

也就是说,拥有一个带有 setter 的静态变量实际上是一个公共全局变量 ALA Basic——您确定这是完成任务的唯一方法吗?

我并不是说静态是绝对错误的,但是您应该尽最大努力在定义它的对象中操作它,而不是使用 setter,否则您会以某种方式暴露出很多对象的内部状态难以控制。

【讨论】:

尽管我讨厌 (Visual) Basic:它不会强制甚至鼓励您使用全局变量。这只是你得到的印象,因为所有那些糟糕的程序员都在使用它。 您在我的帖子中的任何地方都看到了 Visual 这个词吗? :) 我说的是老派,当我学习它时,除了在业务中使用的基础知识之外,没有办法让变量成为全局变量。【参考方案2】:

我想说 Code Complete 的建议非常有力,而您的反对意见“因为我将这些用于我的属性方法”非常弱。无论如何,这些属性设置器/获取器应该是私有的。将其视为一种重载形式并将它们称为 SetFoo 和 GetFoo。

【讨论】:

他试图命名的方法也应该是私有的,因为他将它传递给 Synchronize。除了定义它的线程类之外,没有其他任何理由调用该方法。【参考方案3】:

您使用的是什么 Delphi 版本?如果使用 D2006 或 2007,您可以使用类方法将全局变量移动到类属性中以获取和设置值。由于这些是属性 getter 和 setter,因此使用 Get 和 Set 是合适的。

type
 TMyObject = class(TObject)
 private
    class var
      FStringProperty : string;

    class function GetStringProperty: String; static;
    class procedure SetStringProperty(const Value : string);static;
  public
    class property StringProperty : String read GetStringProperty write SetStringProperty;
  end;

【讨论】:

这并没有真正完成任何事情。它在各个方面都等同于使用普通的全局变量。此外,Synchronize 方法不能接受 SetStringProperty 方法作为参数,因为它需要是零参数方法。如果全局字符串变量在线程之间共享,则需要同步。 使用 Delphi 7,但感谢我在移植代码时记住这一点,尽管在 2009 年我们肯定会使用匿名方法。【参考方案4】:

属性 getter 和 setter 没有以 getset 开头的名称,因为它是为命名 getter 和 setter 保留的一些约定。他们有这些名字是因为他们就是这样做的。由于您的同步方法的目的是设置变量的值,因此给它一个“设置”名称非常有意义。

您可以选择一个同义动词,例如 assigncopy,只是为了与 set 不同,但这些都是非常规的名称你描述的目的。当您有一个设置Foo 值的例程时,约定规定该函数必须命名为SetFoo。最终,我认为您只需要克服使用 getset 处理非属性访问器的问题。

【讨论】:

这并不是我对例程名称有任何疑问,我只是想知道是否有特定的约定。我在分配(ala 类对象克隆)和复制(ala 内存复制)时遇到了同样的问题。我只是不喜欢调用名为 getSomething() 或 setSomething(no params) 的过程。 我认为您确实对例程名称有疑问。您一直在谈论的“问题”只是问题,因为您正在制造它们。但事实并非如此。【参考方案5】:

在我看来,写入全局变量应该很容易与普通的 setter 区分开来。如果无法避免全局变量,我通常使用

SetGlobalFoo(...);

为此。长名称的开销在 IMO 是可以的,因为这些结构应该很少使用。

【讨论】:

【参考方案6】:

我会使用 SetXXXGetXXX 来表示私有和全局变量,因为我看不出这些方法的作用有什么不同。对SetXXX 的操作是对数据区域的集合。如果该数据区域是全局的、本地的或远程的,则它是该方法的内部细节,不应从外部看到。

IDE 将帮助您了解该数据区域是否是本地的,但如果您愿意,可以写一行简单的注释来说明它。

【讨论】:

以上是关于解释啥是全局变量,如何定义的主要内容,如果未能解决你的问题,请参考以下文章

在Postman中啥是全局变量与环境变量?

对于在同一类中设置全局变量的例程,啥是好的命名约定

fortran 定义全局变量

什么是全局变量

全局变量与参数

闭包?啥是闭包?