这不是一个真正的错误,从某种意义上说,你不能使用函数指针作为参数。你可以。出于晦涩、灵活性和性能原因,不鼓励使用函数指针。见https://jira.sonarsource.com/browse/RSPEC-5205。因此,如果您不关心这些考虑因素,您可能想要抑制它。
缺乏灵活性意味着您不能传递额外的上下文(除非使用所谓的“thunk”)。这种缺乏灵活性可以通过为用户上下文使用额外的void* 参数来解决:
_declspec(dllexport) void GetInformation(
void (add)(const char* pCarName, void* context), void* context)
{
add("N3-988", context);
add("N3-40", context);
add("N3-41", context);
add("N3-428", context);
}
您也可以按照建议使用std::function,如果您不知道您的 DLL 将具有 C++ 接口(因此将取决于 C++ 运行时):
_declspec(dllexport) void GetInformation(std::function<void (const char*)> add)
{
add("N3-988");
add("N3-40");
add("N3-41");
add("N3-428");
}
请注意,您不能按照建议使用template,因为无法使用__declspec(dllexport) 从 DLL 导出模板。由于避免了间接,模板将具有固定的性能,但 DLL 接口意味着您无法避免它。
注意函数作为参数:
void GetInformation(void (add)(const char* pCarName))
由于所谓的decay,相当于函数指针参数:
void GetInformation(void (*add)(const char* pCarName))
建议用另一个替换一个的答案具有误导性,它不会解决任何问题。