C++中静态函数之间的区别

bla*_*zio 3 c++ static function

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

Mik*_*one 6

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

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

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

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


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

首先,一些术语.从技术上讲,编译器只是从源代码生成目标代码的部分.该连接器后来发生了一组目标文件和"链接"他们做最后的程序.

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

链接器的工作是读取所有目标文件,并将每个目标文件所需的符号与其他目标文件提供的符号相匹配.如果一切都成功,并且没有任何未解决的所需符号,则链接会成功,您将获得您的程序.

什么static或函数在全局所做的就是简单地告诉编译器不把该符号在目标文件的符号表.没有其他的; 该符号仍然可以在同一个源文件中完全使用.链接器根本看不到符号,因此无法将任何内容链接到它.

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

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


你能解释为什么内联函数被隐式定义为静态吗?

由于内联函数不作为独立的代码片段存在(它们而是"在行中"合并到调用函数中),因此它们不能具有符号表条目(没有任何内容可以链接到).