当我使用-fpermission时,我可以写这样的东西:
void (*NtSetTimerResolution)(ULONG, bool, PULONG) = 0;
int main()
{
NtSetTimerResolution = GetProcAddress(GetModuleHandle("ntdll.dll"), "NtSetTimerResolution");
ULONG pointless;
NtSetTimerResolution(0x1388, 1, &pointless);
return 0;
}
它编译和运行得很好,没有运行时错误。如何重新编写此代码以不包含fpermission?
您需要一个显式强制转换:
NtSetTimerResolution = reinterpret_cast <void (*)(ULONG, bool, PULONG)> (GetProcAddress(GetModuleHandle("ntdll.dll"), "NtSetTimerResolution"));
您可能仍然违反了严格的别名规则,但您可以使用-fno-strict-aliasing
来绕过这一点。
受@Remy评论的启发,这可能会更好(DRY等等):
NtSetTimerResolution = reinterpret_cast <decltype (NtSetTimerResolution)> (GetProcAddress(GetModuleHandle("ntdll.dll"), "NtSetTimerResolution"));
我建议在初始化时使用nullptr
,而不是0
,如果没有其他内容的话,只是为了形式。