c++ - 指向同一个函数的两个函数指针总是相等的吗?

标签 c++ function-pointers

C++ 标准是否保证指向函数的两个指针总是比较相等?我知道这对于非内联函数通常是正确的。但是如果有一个内联函数并且指向该函数的指针是在两个独立的编译单元中创建的,那么链接器会合并两个实例化,还是允许发出重复的函数?

如果上面的答案是“它们相等”:如果有一个带有内联函数的公共(public)头文件,并且主程序和动态加载的插件(共享对象/DLL)都创建一个指针,这仍然成立吗?函数?

最佳答案

C++11 标准的第 5.10/1 节说:

Two pointers of the same type compare equal if and only if they are both null, both point to the same function, or both represent the same address

同一个 inline 函数的两个拷贝仍然是同一个函数。从实现的角度来看,编译器将在每个翻译单元中生成函数的拷贝,但链接器随后会丢弃其中一个拷贝,因此只剩下一个。

通过获取函数的地址,您可以防止它被内联(与 inline 不同,后者更多是为了避免违反单一定义规则)。

DLL 超出了标准的范围,但只有一个函数拷贝会保留在二进制镜像中,因此从 DLL 获取函数地址(例如 GetProcAddress)将获得与DLL 中的代码。

关于c++ - 指向同一个函数的两个函数指针总是相等的吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19134124/

相关文章:

c - 将函数指针作为参数传递

c++数组拷贝给出奇怪的结果

c++ - Cpp/Cli 项目中的 Boost::Log 错误

c++ - fstream 指向特定路径(到桌面 ex.)

c++ - 将 nullptr 分配给函数指针变量是否安全?

c++ - 未声明的标识符 (newGame) - 指向函数作为参数的指针

c++ - 如何让 Doxygen 记录 C++ 文件中定义的类?

c++ - 不允许抽象类的对象

c++ - 类似于 C++ 中的 Objective-C KVO

c++ - 函数参数中的空指针和强制转换