我昨晚在写代码,犯了一个错误。我需要将指向所需函数的指针写入进程的虚拟内存。我是这样做的:
uint64_t *some_mapped_memory = ...;
some_mapped_memory[0] = reinterpret_cast<uint64_t>(myFunc);
错误是我没有把&函数名放在前面。而且被触摸的不是指针,而是“函数本身”。但是,此代码按预期工作。
而且,后来我做了一个测试:
#include <cstdio>
void f() {}
int main() {
void (*fnc1)() = f;
void (*fnc2)() = &f;
printf("%p %p\n", f, &f);
return 0;
}
它不仅printf输出了两个相同的值,而且上面的代码编译没有问题。
我用谷歌搜索了一下,但没有找到任何关于此的内容。老实说,我手头没有gcc任何其他编译器,我用visual c++. 标准对我的代码有何看法?好吧,它必须在另一个编译器上工作,还是只有效&f?为什么我的开发环境显示fnc1两者fnc2都是void(*)(),但是auto fnc3 = f是void()?
总的来说,我展示的是标准描述的某种邪恶智能转换,还是可以的邪恶智能转换visual c++?
函数名(不是成员函数!)始终可以转换为函数指针,无论函数名之前是否存在 & 符号。C++ 17 草案 [conv.func]:
更多关于函数指针的内容可以在我的文章中找到,虽然没有参考标准,因为。它专为入门级设计。