函数的作用域是什么意思?

7

函数作用域是什么意思?

我理解变量的作用域。当我们谈论函数作用域时,是否指的是结构(类)内的函数,或者在C/C++程序的main()中调用的普通函数也有作用域呢?


3
你在哪里看到这个用词的? - cnicutar
2
请注意,函数本身的作用域(标识符在哪里有效?-与变量的作用域相同)和函数作用域之间存在区别。函数作用域是指由函数涵盖的另一个标识符的作用域(在函数内定义的变量在{}之间有效)。 - sbi
1
@sbi,说得好。这里的好答案只涉及第一种定义,但问题可能涉及另一种定义。 - unkulunkulu
4个回答

9
粗略地说,作用域是指名称可以声明的区域。在作用域中声明的名称在该作用域内及某些情况下也可以在外部访问。
(准确地说,它实际上是一个声明区域,名称的作用域是程序中名称有效的部分。它从声明处开始,并包括该区域的其余部分以及有时还包括其他一些区域。)
作用域由命名空间、类和复合语句(即由{}围绕的代码语句块)引入。最后一个包括函数体。
大多数对象和函数都有名称,每个名称都在一个作用域内。
因此,“函数的作用域”可能意味着两件事:要么是函数体定义的作用域,在其中声明其局部变量; 要么是声明函数名称的作用域(可以是类或命名空间)。
更新:你说你的意思是函数名称的作用域。这始终从声明后立即开始,其结束取决于声明的位置。
  • 如果它在命名空间中声明,则持续到关闭该命名空间。如果在同一翻译单元中稍后重新打开了该命名空间,则会重新进入作用域。
  • 如果它在类定义中作为成员函数声明,则该作用域持续到类定义结束。它在任何派生类的定义内以及在该类或派生类的成员定义内也可以使用。
  • 如果它在类定义中作为友元或在函数定义内部声明,则名称实际上是在周围命名空间中声明的,其作用域与该情况相同。

@SwathiAppari:好的,我已经提供了更多关于那个的细节。 - Mike Seymour
有时候,还有一些其他地区。怎么办? - Don Larynx
@DonLarynx:命名空间可以关闭并重新打开,以便其作用域可以覆盖多个区域。类作用域涵盖类定义及成员函数和嵌套类的定义。 - Mike Seymour
请定义“region”?它与“scope”有何区别? - Don Larynx
1
@DonLarynx 声明区是指可以出现声明的单个连续区域。作用域是一组可能不连续的区域,在其中声明的名称是可访问的。如果您想要精确的定义,请参阅标准。 - Mike Seymour
显示剩余4条评论

7

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


谢谢,我觉得您和Jerry Coffin的回答都很完整。 - Swathi Appari
这并没有回答问题。你从来没有提到作用域实际上是什么意思 - 只是提到了作用域函数可以有哪些。 - Don Larynx

3
是的,函数也有作用域,尽管它们的作用域通常比大多数变量的作用域更大。
在 C 中(我编写此内容时其中之一是标签),函数具有全局作用域或文件作用域。全局作用域适用于整个程序中可见的普通函数。文件作用域适用于您已将其标记为“静态”的函数,因此仅在同一翻译单元内可见。
C++ 对这些使用稍微不同的名称,但具有相同的基本概念。它添加了以实际命名为“namespace”和结构/类形式的名称空间。除一个例外外,在命名空间中的函数仅在该命名空间内可见。该例外是如果您在类/结构中定义了一个友元函数:
class X {
    friend void whatever(X const &) { do_something(); }
};

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

1

我认为这里所指的是标签(使用goto语句时使用的标签)可见的范围。

也许this文章可以帮助您理解作用域。 您还可以查看stackoverflow上的this问题。


1
你所指的是“函数作用域”,而不是函数的范围。 - Felice Pollano
@FelicePollano,抱歉,我误解了问题。 - SingerOfTheFall

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接