小编use*_*055的帖子

C 回调函数的 C++“动态”函数指针

我有一个用于管理相机配置的 API。有 344 个单独的选项需要管理。当某个值发生变化时,API 会调用回调函数来通知程序。注册函数需要一个

void RegisterCallback(Option * ptr, void (fn*)(void*))

函数指针作为回调函数。我不能使用单个函数进行回调,因为我现在知道回调来自.

一种解决方案是创建 344 个单独的回调函数:

void callback0(void*);
void callback1(void*);
...
void callback{n-1}(void*);

static void(*)(void*) callbacks[] = {callback0, callback1, ..., callback{n-1}};
Run Code Online (Sandbox Code Playgroud)

对于此解决方案,我需要使用单独的工具/脚本生成标头。

另一种解决方案是使用一些预处理器魔法(BoostPP),比如

BOOST_PP_FOR((0,1024), PRED, OP, MYSTERIOUS_CALLBACK_MACRO);
Run Code Online (Sandbox Code Playgroud)

根据我的经验,这些宏对于开发人员来说是不可读的,并且难以维护。

理想情况下,我可以使用类似的东西 RegisterCallback(popt, [n](void*){/*n-th callback*/});

但是 lambda 函数是一个函子而不是函数指针。

我的问题是:我可以动态创建这些函数吗?或者有没有比上面两个更好的解决方案?

谢谢你。

编辑

我从 Botje 那里得到了答案。将对象传递给函数回调需要您访问二进制级别的代码(超出 C/C++ 级别)。如果您可以允许,那么 libffi 可以是一个解决方案,因为它会生成一个指向您的函数的每个实例的特定指针。它得到了广泛的支持,但是,例如 Visual Studio Compiler 不在列表中。

编辑 2 正如其他人指出的那样,它也应该与 VS 一起使用。

c++ lambda function-pointers functor

5
推荐指数
1
解决办法
541
查看次数

带有 WebPack ReferenceError 的 MathJax:未定义要求

我想将公式放在我的网页中,该网页使用 (dotnet Kestrel)。我不想从网络加载 javascript 库,所以我使用 webpack 和 npm 作为我的包。我的问题是,我发现无法加载 MathJax。我尝试了以下方法:

import 'mathjax-full';
require('mathjax-full'); // << not the error itself
import MathJax from 'mathjax-full';
Run Code Online (Sandbox Code Playgroud)

我得到的最烦人的错误是:

ReferenceError: require is not defined
Run Code Online (Sandbox Code Playgroud)

我必须做一些明显错误的事情。错误消息来自 MathJax 内部。我也尝试导入requirejs,因为一些论坛提到这是某种“解决方法”。我在运行 WebPack 时遇到的错误是:

ERROR in ./node_modules/requirejs/bin/r.js 1:0
Module parse failed: Unexpected character '#' (1:0) 
Run Code Online (Sandbox Code Playgroud)

有没有人在 WebPack 上使用 MathJax 成功?

javascript mathjax webpack

5
推荐指数
0
解决办法
307
查看次数

为什么我们不能将调试和发布版本与 MSVC 混合使用?

我有一个常见问题,这一次,我不想解决它,而是想了解这种设计选择的好处。我拥有 15 年以上的 Linux/C++ 开发经验,但在构建 Windows 应用程序方面遇到了困难。

我有一个与专有组件(Intel OneApi 和 Basler Pylon)链接的应用程序。我想调试我的应用程序,但我无法在调试模式下编译我的代码,因为专有组件不为其库提供调试版本。

在 Linux 上我可以混合使用任何库;发布和调试。我什至可以混合使用不同编译器版本构建的库,只要 ABI 在不同版本之间不发生变化即可。

如果我无法使用 MSVC 在 Windows 上以调试模式构建应用程序,那么我应该如何调试它们?

如果官方推荐的是“只写好代码”的方法,那么这种限制有什么令人难以置信的好处呢?该库的运行速度是否快了 2 倍?占用的存储空间是否减少了 10 倍?

可笑的是,MinGW即使在 Windows 上也允许混合调试和发布库,但是专有库是使用 MSVC 构建的。

感谢您的见解。

c++ windows visual-c++

5
推荐指数
1
解决办法
318
查看次数