C++中静态函数之间的差异

difference between static functions in C++

本文关键字:之间 静态函数 C++      更新时间:2023-10-16

任何人都可以解释类中定义的静态函数和例如在file.hpp中声明并在文件中定义的静态函数之间的区别.cpp(我只能在这个文件中使用这个静态函数?

任何人都可以解释类中定义的静态函数之间的区别吗

这意味着该函数是类范围的,不需要对特定对象进行操作。换句话说,对于该功能,没有this

和静态函数,例如在 file.hpp 中声明并在文件中定义.cpp(我只能在这个文件中使用这个静态函数?

这意味着

该函数没有外部链接,这意味着其他编译单元(即目标文件)无法链接到它,因为它不在符号表中。


感谢您的回复,但您能解释一下为什么其他编译单元无法链接到它吗?

首先,一些术语。从技术上讲,编译器只是从源代码生成目标代码的部分。链接稍后获取一组对象文件并"链接"它们以制作最终程序。

为了完成这项工作,编译器生成一个"符号表",并将其与编译的代码一起放入目标文件中。此符号表列出了文件中全局变量和函数的符号,以及代码需要链接到才能工作的外部符号。

链接器的工作是读取所有对象文件,并将每个对象文件所需的符号与其他对象文件提供的符号进行匹配。如果一切成功,并且没有任何未解析的所需符号,则链接成功,您将获得程序。

函数或全局static所做的只是告诉编译器不要将该符号放在对象文件的符号表中。没有别的;该符号在同一个源文件中仍然完全可用。链接器根本看不到该符号,因此无法将任何内容链接到该符号。

类成员不能以这种方式"消失",因此static类的上下文中具有不同的含义。 (这种关键字的回收可能是为了避免向语言添加另一个保留字。顺便说一句,Objective-C以不同的方式解决了同样的问题,使用+-令牌。

(当应用于函数或方法中声明的变量时,static可以具有另一种含义,正如 Mike 在下面指出的那样。在这种情况下,它基本上是一个全局变量,但对函数来说是私有的。


您能否解释一下为什么内联函数被隐式定义为静态?

由于内联函数

不作为独立的代码片段存在(它们被"内联"合并到调用函数中),因此它们不能具有符号表条目(没有可链接的内容)。

请参考此链接

函数内的静态变量在调用之间保持其值。但是,在C++中,static 还用于定义类属性(在同一类的所有对象之间共享)和方法。在 C 中没有类,所以这个特性是无关紧要的。

在全局范围内定义的静态函数之间没有区别,无论它是在头文件中还是在源文件中。除非头文件未包含在任何地方,否则其中的函数从未在任何地方真正定义过。

那么在谈论静态(非成员)函数时你需要学习的短语是翻译单元。翻译单元是预处理器处理文件后的源文件以及该源文件中包含的所有头文件,并且是编译器的实际输入。静态函数是翻译单元的本地函数,这就是为什么在源文件或头文件中定义静态函数没有区别的原因。

您还可以使用匿名命名空间来定义函数,它们将仅是匿名命名空间所在的翻译单元的本地函数。

另请注意,定义为inline的函数也隐式定义为static


静态成员

函数是类的一部分,可以访问不带作用域前缀的静态成员变量。当然,它们必须以要调用的类的作用域为前缀。静态成员函数和非静态成员函数之间的区别在于,静态成员函数不是类的任何特定实例的一部分,因此没有this指针。如果要访问特定的类实例成员变量,则必须通过参数将该实例传递给静态成员函数。