从VS到GCC的C / C ++宏扩展会产生错误

时间:2013-06-02 08:35:19

标签: c++ c gcc macros

这适用于VS C ++,但会产生使用GCC编译的错误:

“错误:从'int(*)(float,int)'无效转换为'void *'[-fpermissive] |”

#define CLASS_HOOK_FUNC(vtable, name, tableindex) oNHook_##name = (_##name)vtable.HookVTableFunctionByIndex(tableindex, hNHook_##name);

#define HOOK_EXPORT(name) CLASS_HOOK_FUNC(g_ctExport, name, EXPORTID_##name);

HOOK_EXPORT(H_Redraw);

2 个答案:

答案 0 :(得分:2)

Microsoft C ++允许从函数指针隐式转换为标准不允许的void*。 GCC发出错误。

最近有一条关于Microsoft Connect的错误报告:https://connect.microsoft.com/VisualStudio/feedback/details/786150/msvc-performs-implicit-conversion-of-function-pointers-to-void

你只需要对void*进行显式转换,HookVTableFunctionByIndex()的任何参数都将函数指针作为void*

答案 1 :(得分:0)

MSC允许从函数指针隐式转换为void *。但这对每个编译器都无效。所以,即使这在gcc上有效,但除非你通过添加-fpermissive强制gcc允许它,否则不允许这样做