获取函数的地址?
getting the address of the function?
我正在编写这段代码,打印下面的这一行显示了地址,这怎么可能?
struct back
{
static const int y = 7;
static int f(int i = 0)
{
return i / 2;
}
};
std::cout << back::f; // 003A143D
获取函数的地址?
您可以使用 addressof 运算符&
获取函数的地址。结果(非静态成员函数除外(是指向函数的指针。函数左值可以在左值到右值转换之前隐式转换为指向函数的指针。这种隐式转换称为衰减。
在下面打印这一行向我显示地址,这怎么可能?
由于某些语言扩展,这可能是可能的。该标准未指定用于插入字符流的函数指针的重载。标准的符合行为是打印 1,因为函数指针隐式转换为具有流插入重载的 bool,并且函数的地址永远不会为 null。
这几乎不是预期的行为,这就是为什么高质量的编译器在函数衰减到指针时默认发出警告的原因。
从 eerorika 的回应来看,类静态函数地址的打印似乎是偶然的,而不是标准的。
如果您愿意,可以覆盖该行为。 例如
#include <iostream>
namespace {
struct back {
static const int y = 7;
static int f(int i = 0) {
return i / 2;
}
};
std::ostream& operator<<(std::ostream& out, decltype(back::f)) {
out << "baby ducks";
return out;
}
} // anon
int main() {
std::cout << back::f << "n"; // Output: baby ducks
}
警告(来自评论部分(:重载<<
int(int)
不是一个好主意,因为不涉及用户定义的类型。
相关文章:
- 如何在c++程序中找到函数的地址
- 函数名是c中该函数的第一条指令的地址吗
- 从 C++ 中的函数返回数组地址问题
- 为什么成员函数地址离自由函数这么远?
- 调用 lua 函数的地址为 C/C++?
- 在 Microsoft Access SQL 中调用自定义 DLL 函数时传递的内存地址无效
- 为什么每次执行时函数的地址都不同?
- 我正在尝试将表的地址传递给要在另一个函数中使用的指针,但得到不兼容的指针类型
- 获取函数的地址?
- 模板到函数的时刻地址是否可以作为指向某个函数的函数指针传递?
- 为什么使用存储在虚拟方法表中的地址调用虚拟函数的函数会返回垃圾?
- 指针在函数调用后更改其地址
- 在 gcc/clang (C++) 中获取函数范围之外的标签地址
- 在每个运行时将函数保存到相同的地址
- 在指向现有内存地址的 hpp 文件中声明成员函数的最佳方法
- 创建一个函数来转换数组元素的类型并返回数组的地址
- 如何定义全局函数指针并分配给特定地址
- 常量引用函数参数的地址何时唯一?
- 打印我的Get MAC地址函数的std::字符串时出现意外输出
- 成员函数地址(函数指针)