我在视听演播室里运行了一个声纳插件。我的代码有一个主要问题,如下所示:
_declspec(dllexport) void GetInformation(void (add)(const char* pCarName))
{
add("N3-988");
add("N3-40");
add("N3-41");
add("N3-428");
}
错误是
cpp:S5205 : Replace this function pointer with a template parameter or a "std::function".
怎么修呢?
发布于 2021-03-16 12:19:26
这不是一个真正的错误,从某种意义上说,不能使用函数指针作为参数。你可以的。由于模糊、灵活性和性能方面的原因,不鼓励使用函数指针。见https://jira.sonarsource.com/browse/RSPEC-5205。所以如果你不关心这些考虑的话,你可能会想抑制它。
缺乏灵活性意味着您无法传递额外的上下文(除非使用所谓的“块”)。这种缺乏灵活性的问题可以通过为用户上下文使用额外的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))
由于所谓的衰变,等价于函数指针参数
void GetInformation(void (*add)(const char* pCarName))
建议用另一个代替一个的答案是误导的,它不会解决任何问题。
发布于 2021-03-16 11:04:41
这个错误是一条红鲱鱼。您错误地输入了函数指针语法,仅此而已。你需要
void (*add)(const char* pCarName)
作为参数类型。然后,add
是一个函数指针,它在函数体(add("N3-988");
等)中使用。是合适的。
发布于 2021-03-16 11:09:42
也许如下所示
#include <cstdio>
template<typename FuncT>
void GetInformation(FuncT func)
{
func("N3-988");
func("N3-40");
func("N3-41");
func("N3-428");
}
int main()
{
auto func = [](const char* s){ printf("%s\n",s); };
GetInformation(func);
}
https://stackoverflow.com/questions/66653884
复制相似问题