C++中静态函数之间的差异
difference between static functions in C++
任何人都可以解释类中定义的静态函数和例如在file.hpp中声明并在文件中定义的静态函数之间的区别.cpp(我只能在这个文件中使用这个静态函数?
任何人都可以解释类中定义的静态函数之间的区别吗
这意味着该函数是类范围的,不需要对特定对象进行操作。换句话说,对于该功能,没有this
。
这意味着和静态函数,例如在 file.hpp 中声明并在文件中定义.cpp(我只能在这个文件中使用这个静态函数?
该函数没有外部链接,这意味着其他编译单元(即目标文件)无法链接到它,因为它不在符号表中。
感谢您的回复,但您能解释一下为什么其他编译单元无法链接到它吗?
首先,一些术语。从技术上讲,编译器只是从源代码生成目标代码的部分。链接器稍后获取一组对象文件并"链接"它们以制作最终程序。
为了完成这项工作,编译器生成一个"符号表",并将其与编译的代码一起放入目标文件中。此符号表列出了文件中全局变量和函数的符号,以及代码需要链接到才能工作的外部符号。
链接器的工作是读取所有对象文件,并将每个对象文件所需的符号与其他对象文件提供的符号进行匹配。如果一切成功,并且没有任何未解析的所需符号,则链接成功,您将获得程序。
函数或全局static
所做的只是告诉编译器不要将该符号放在对象文件的符号表中。没有别的;该符号在同一个源文件中仍然完全可用。链接器根本看不到该符号,因此无法将任何内容链接到该符号。
类成员不能以这种方式"消失",因此static
类的上下文中具有不同的含义。 (这种关键字的回收可能是为了避免向语言添加另一个保留字。顺便说一句,Objective-C以不同的方式解决了同样的问题,使用+
和-
令牌。
(当应用于函数或方法中声明的变量时,static
可以具有另一种含义,正如 Mike 在下面指出的那样。在这种情况下,它基本上是一个全局变量,但对函数来说是私有的。
由于内联函数您能否解释一下为什么内联函数被隐式定义为静态?
不作为独立的代码片段存在(它们被"内联"合并到调用函数中),因此它们不能具有符号表条目(没有可链接的内容)。
请参考此链接
函数内的静态变量在调用之间保持其值。但是,在C++中,static 还用于定义类属性(在同一类的所有对象之间共享)和方法。在 C 中没有类,所以这个特性是无关紧要的。
在全局范围内定义的静态函数之间没有区别,无论它是在头文件中还是在源文件中。除非头文件未包含在任何地方,否则其中的函数从未在任何地方真正定义过。
那么在谈论静态(非成员)函数时你需要学习的短语是翻译单元。翻译单元是预处理器处理文件后的源文件以及该源文件中包含的所有头文件,并且是编译器的实际输入。静态函数是翻译单元的本地函数,这就是为什么在源文件或头文件中定义静态函数没有区别的原因。
您还可以使用匿名命名空间来定义函数,它们将仅是匿名命名空间所在的翻译单元的本地函数。
另请注意,定义为inline
的函数也隐式定义为static
。
静态成员
函数是类的一部分,可以访问不带作用域前缀的静态成员变量。当然,它们必须以要调用的类的作用域为前缀。静态成员函数和非静态成员函数之间的区别在于,静态成员函数不是类的任何特定实例的一部分,因此没有this
指针。如果要访问特定的类实例成员变量,则必须通过参数将该实例传递给静态成员函数。
- 给定一个C++嵌套的私有结构类型,是否有从文件范围静态函数访问它的策略
- 为什么不允许成员函数和非成员函数之间的函数重载?
- 检查编译时是否存在静态函数
- 名称隐藏对静态函数继承的实例使用
- 如果 C 函数仍然可以间接执行(通过回调函数),那么将它声明为静态函数是否是一种不好的做法?
- 类中静态函数C++意外结果
- 在工人类中使用不同类的静态函数进行实验
- 类 Referention 中C++回调函数引用非静态函数
- 指向模板上下文中的成员函数或静态函数的指针
- 使用 enable_if 在按值传递与按引用传递之间更改函数声明
- 如何检测 Clang AST C++中的静态函数
- 内联asm编译器屏障(内存阻塞器)是算作外部函数,还是算作静态函数调用
- 将重载构造函数传递给类之间的函数
- 如何在静态函数中使用成员函数数组
- (2 问题)"类"类型重新定义(即使 #pragma 一次),以及静态函数内的静态成员对象初始化?
- 生成代码(在编译时)以调用模板的每个实例化的静态函数
- 静态函数到类的静态指针之间的区别是什么
- 不同类之间的非静态函数的C++回调
- C++中静态函数之间的差异
- 链式静态函数调用之间的参数求值顺序