任何人都可以解释在类中定义的静态函数和声明的静态函数之间的区别,例如:在file.hpp中并在file.cpp中定义(我只能在此文件中使用此静态函数?
答案 0 :(得分:6)
任何人都可以解释在类
中定义的静态函数之间的区别
这意味着该函数是类范围的,不需要对特定对象进行操作。换句话说,对于该功能,没有this
。
和静态函数声明,例如在file.hpp中并在file.cpp中定义(我只能在此文件中使用此静态函数?
这意味着该函数没有外部链接,这意味着其他编译单元(即目标文件)无法链接到它,因为它不在符号表中。
感谢您的回复,但是您能否解释为什么其他编译单元无法链接到它?
首先,一些术语。从技术上讲,编译器只是从源代码生成目标代码的部分。 链接器稍后会获取一组目标文件并“链接”它们以制作最终程序。
为了使这项工作,编译器生成一个“符号表”并将其与编译的代码一起放入目标文件中。此符号表列出了文件中全局变量和函数的符号,以及代码需要链接到的外部符号才能工作。
链接器的工作是读取所有目标文件,并将每个目标文件所需的符号与其他目标文件提供的符号相匹配。如果一切都成功,并且没有任何未解决的所需符号,则链接会成功,您将获得该程序。
函数或全局函数的static
只是告诉编译器不要将该符号放在目标文件的符号表中。没有其他的;该符号仍然可以在同一个源文件中完全使用。链接器根本看不到符号,因此无法将任何内容链接到它。
类成员不能以这种方式“消失”,因此static
在类的上下文中具有不同的含义。 (关键字的这种回收可能是为了避免在语言中添加另一个保留字.BTW,Objective-C使用+
和-
令牌以不同的方式解决了同样的问题。 / p>
(并且static
在应用于在函数或方法中声明的变量时可以有另一种含义,正如迈克在下面指出的那样。在这种情况下,它基本上是一个全局变量,但对函数是私有的。)
你能解释为什么内联函数被隐式定义为静态吗?
由于内联函数不作为独立的代码片段存在(它们而是“在行中”合并到调用函数中),因此它们不能有符号表条目(没有任何内容可以链接)。
答案 1 :(得分:0)
请参阅此link
函数内的静态变量在调用之间保持其值。 但是,在C ++中,static也用于定义类属性(在同一个类的所有对象之间共享)和方法。在C中没有类,所以这个功能是无关紧要的。
答案 2 :(得分:-1)
全局范围中定义的静态函数之间没有区别,无论它是在头文件中还是在源文件中。除非头文件没有包含在任何地方,否则其中的函数永远不会在任何地方被定义。
然后,在谈论静态(非成员)功能时,您需要学习的短语是翻译单元。在预处理器处理完文件并且是编译器的实际输入之后,转换单元是源文件和包含在该源文件中的所有头文件。静态函数是转换单元的本地函数,这就是为什么在源文件或头文件中定义它没有区别。
您还可以使用匿名命名空间来定义函数,它们只是匿名命名空间所在的转换单元的本地。
另请注意,定义为inline
的函数也隐式定义为static
。
静态成员函数是类的一部分,可以访问没有作用域前缀的静态成员变量。它们当然必须以要调用的类的作用域为前缀。静态成员函数和非静态成员函数之间的区别在于静态成员函数不是该类的任何特定实例的一部分,因此没有this
指针。如果要访问特定的类实例成员变量,则必须通过参数将实例传递给静态成员函数。