将函数指针映射到 std::string
Map function pointer to std::string
是否可以在符合标准的 C++ 中将函数指针映射到 std::string
?
将函数指针转换为对象指针甚至进行指针算术都是函数指针的限制,但在这个相关问题中
How to format a function pointer?
给出以下代码:
int (*funcptr)() = main;
unsigned char *p = (unsigned char *)&funcptr;
int i;
for (i = 0; i < sizeof funcptr; i++)
{
printf("%02x ", p[i]);
}
putchar('\n');
该代码经受住了同行的审查。我有点困惑。使用数组语法访问函数指针是合法的,但指针运算不合法?
这是我目前拥有的。我的编译器没有抱怨,样本量为 1 时,一切看起来都很好。
template<class F>
std::string fptr_to_str(F fptr)
{
auto fptr_bytes = (const char*)fptr;
return {fptr_bytes, sizeof(fptr_bytes)};
}
仅当您的平台实际上具有不同指针大小的单独代码和数据段时(几乎没有人再这样做),才将函数指针转换为对象指针。因此,尽管从技术上讲它很糟糕,但实际上没人在乎,Linux 和 Windows 等常见平台上的核心 OS API 依赖于它。
只需转换为 void*
,然后像任何其他指针一样格式化它。
备用代码获取函数指针的地址,并在那里提取字节。
您的代码获取函数的地址,并在那里提取字节。
这些是不同的操作。
是否可以在符合标准的 C++ 中将函数指针映射到 std::string
?
将函数指针转换为对象指针甚至进行指针算术都是函数指针的限制,但在这个相关问题中
How to format a function pointer?
给出以下代码:
int (*funcptr)() = main;
unsigned char *p = (unsigned char *)&funcptr;
int i;
for (i = 0; i < sizeof funcptr; i++)
{
printf("%02x ", p[i]);
}
putchar('\n');
该代码经受住了同行的审查。我有点困惑。使用数组语法访问函数指针是合法的,但指针运算不合法?
这是我目前拥有的。我的编译器没有抱怨,样本量为 1 时,一切看起来都很好。
template<class F>
std::string fptr_to_str(F fptr)
{
auto fptr_bytes = (const char*)fptr;
return {fptr_bytes, sizeof(fptr_bytes)};
}
仅当您的平台实际上具有不同指针大小的单独代码和数据段时(几乎没有人再这样做),才将函数指针转换为对象指针。因此,尽管从技术上讲它很糟糕,但实际上没人在乎,Linux 和 Windows 等常见平台上的核心 OS API 依赖于它。
只需转换为 void*
,然后像任何其他指针一样格式化它。
备用代码获取函数指针的地址,并在那里提取字节。
您的代码获取函数的地址,并在那里提取字节。
这些是不同的操作。