gpt4 book ai didi

c++ - C++中静态函数的区别

转载 作者:太空狗 更新时间:2023-10-29 20:42:05 26 4
gpt4 key购买 nike

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

最佳答案

Can anybody explain difference between static function defined within class

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

and static function declared e.g. in file.hpp and defined in file.cpp (I can only use this static function within this file ?

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


Thanks for your reply but could you explain why other compilation units cannot link to it ?

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

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

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

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

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

(并且 static 应用于在函数或方法内部声明的变量时还有另一种含义,正如 Mike 在下面指出的那样。在这种情况下,它基本上是一个全局变量,但对函数是私有(private)的。)


Could you also explain why inline functions are implicitly defined as static ?

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

关于c++ - C++中静态函数的区别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20050015/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com