c++ - 可以用C语言修改函数指针吗?
问题描述
我现在有一个功能A(int num)
。我想得到另一个函数,它在执行之前B(int num)
运行另一个函数。我打算写的是C()
A(num)
typedef void (*function_type)(int);
function_type attachToFunction(function_type original, void (*additional_function)(void))
{
/* return a function_type which first runs additional_function, and then runs original(int) */
}
但是,我不知道我应该如何完成该功能或是否可能。
我同时使用 C 和 C++,所以只要函数声明不变,C++ 实现也是可以接受的。
解决方案
不是用干净的方式。
您可能会使用 global,因为您无法使用该接口捕获参数:
typedef void (*function_type)(int);
static function_type g_original = 0;
static void (*g_additional_function)() = 0;
void my_function(int n)
{
if (g_additional_function) g_additional_function();
if (g_original ) g_original(n);
}
function_type attachToFunction(function_type original,
void (*additional_function)(void))
{
g_original = original;
g_additional_function = additional_function
return my_function;
}
由于是全局的,您一次只能拥有一个“附加”功能。
在 C++ 中,您可以通过模板“捕获”函数指针。这些参数应该是编译时的
template <function_type f, void (*g)()>
void funcT(int n)
{
g();
f(n);
}
用法类似于
void C();
void A(int b);
void (*B)(int) = &funcT<&A, &C>;
推荐阅读
- excel - 根据值和复选框隐藏 Excel 中的某些行
- api - 如何从 JSON 文件中获取 DialogFlow 中的 API V2 密钥?
- python-3.x - 为图像形态学 Python 创建结构元素
- c# - Microsoft UWP MediaPlayer 示例引发 Memory AccessViolationException
- javascript - Phaser 3 如何运行 spritesheet 动画并移动
- python - PyCharm 没有从当前文件产生预期的输出
- python - 如何通过 15 个元素的跨度并对它们进行平均来转换系列?
- javascript - 为什么 react-native webview 加载页面超级缩小?
- clojure - 为什么macroexpand 不打印defmacro 的结果?
- javascript - 未捕获的 TypeError 和自动向下滚动