【问题标题】:What does scope of functions mean?功能范围是什么意思?
【发布时间】:2012-07-05 13:43:43
【问题描述】:

函数范围是什么意思?

我了解变量的范围。当我们谈到函数的作用域时,它是指结构(类)中的函数还是我们在 C/C++ 程序的main() 中调用的普通函数的作用域?

【问题讨论】:

  • 你在哪里遇到过这种说法?
  • 请注意,有 函数本身的作用域(这个标识符在哪里有效? - 与变量的作用域相同)和 函数作用域,它是函数跨越的另一个标识符的范围(函数内定义的变量在{} 之间有效)。
  • @sbi,好点子,这里的好答案只针对第一个定义,但问题可能与另一个定义有关。

标签: c++ scope


【解决方案1】:

简单地说,作用域是一个可以在其中声明名称的区域。在范围内声明的名称可以在该范围内访问,在某些情况下,也可以从外部访问。

(学究起来准确地说,那其实是一个声明区域,而一个名字的作用域就是这个名字在程序中有效的部分。它从声明的地方开始,包括该区域的其余部分,有时还包括其他一些区域。)

作用域由命名空间、类和复合语句(即由{} 包围的代码语句块)引入。最后一个包括函数体。

大多数对象和函数都有名称,每个名称都在一个范围内。

所以“函数的范围”可能意味着两件事:要么是由函数体定义的范围,其中声明了它的局部变量;要么是由函数体定义的范围;或声明函数名的作用域(类或命名空间)。

更新:你说你的意思是函数名的范围。这总是在声明之后立即开始;它在哪里结束取决于该声明的位置。

  • 如果在命名空间内声明它,它会一直持续到该命名空间关闭。如果稍后在同一个翻译单元中重新打开命名空间,那么它会回到那里的范围。
  • 如果在类定义中将其声明为成员函数,则作用域将持续到类定义结束。它也在任何派生类的定义范围内,也在该类或派生类的成员定义内。
  • 如果它在类定义中声明为友元,或者在函数定义中,则名称实际上是在周围的命名空间中声明的,并且范围与这种情况相同。

【讨论】:

  • 范围实际上并不是指名称可以访问的区域,例如,范围可以跨越多个块。至少一个变量的作用域是从它被声明的地方开始的。
  • @unkulunkulu:从技术上讲,它是名称有效的区域,我稍微松散地使用它来指代声明区域。我会看看我是否可以在不复杂的情况下使答案更正确。
  • 是的,我的措辞不好,我的主要观点是“声明”这个词也不是 100% 正确的。
  • 谢谢,我的意思是你提到的函数名声明的范围
  • @DonLarynx 声明区域是可以出现声明的单个连续区域。范围是一组可能不连续的区域,在这些区域中可以访问声明的名称。如果您想要精确的定义,请参阅标准。
【解决方案2】:

函数可以具有全局、命名空间、类(在这种情况下通常称为成员)或本地(在另一个函数内)范围。它们也可以是static,为它们提供内部链接或在匿名命名空间内,使它们在翻译单元之外无法访问(同时仍具有外部链接,因此它们可以用作模板参数)。

【讨论】:

  • 谢谢,我觉得和你一样,杰瑞棺材的回答很完整
  • 这没有回答问题。您在任何地方都没有提及作用域的实际含义 - 只有作用域函数可以具有什么。
【解决方案3】:

是的,函数也有作用域,尽管它们的作用域通常比大多数变量的作用域大。

在 C [编辑:这是我写这篇文章时的标签之一] 中,函数具有全局范围或文件范围。全局范围适用于在整个程序中可见的普通函数。文件范围适用于您标记为“静态”的函数,因此它仅在同一个翻译单元中可见。

C++ 使用的名称略有不同,但基本概念相同。它以实际命名为“命名空间”和structs/classes 的形式添加命名空间。除了一个例外,命名空间中的函数仅在该命名空间内可见。例外情况是,如果您在 class/struct 中定义了 friend 函数:

class X {
    friend void whatever(X const &) { do_something(); }
};

在这种情况下,即使函数是在 X 内部定义的,它的名称也会被注入到周围的命名空间中,因此它在 X 之外是可见的。

【讨论】:

    【解决方案4】:

    我认为这里的意思是 Label (一个 Label 是您在 goto 语句中使用的)可见的范围。

    也许this 文章也可以帮助您了解作用域。 你也可以看看thisstackoverflow 上的问题。

    【讨论】:

    • 你指的是“功能范围”而不是功能的范围。
    • @FelicePollano,对不起,我误解了这个问题。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-01-10
    • 2019-04-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多