在C语言中模拟lambda表达式的优雅方法 让我们考虑一个C程序的场景: RESPONSE_CALLBACK_T response_callback = &response_callback_function; SendRequest(param1, param2, response_callback);
在C语言中模拟lambda表达式的优雅方法 让我们考虑一个C程序的场景: RESPONSE_CALLBACK_T response_callback = &response_callback_function; SendRequest(param1, param2, response_callback);,c,lambda,C,Lambda,SendRequest函数可能会在Web服务器上发布一些数据,或者调用一些其他程序模块,这些模块在完成任务后会触发回调。因此,在调用此函数时,我们需要指定指向已定义回调函数的指针 是否有一种优雅的方式来编写此代码,类似于支持lambda表达式的高级OPP语言,例如: SendRequest(param1, param2, function(int responseCode) { print(responseCode) }); 如何才能最好地模拟这种行为?在标准C中,无法提供函数文本;函数指针必
SendRequest
函数可能会在Web服务器上发布一些数据,或者调用一些其他程序模块,这些模块在完成任务后会触发回调。因此,在调用此函数时,我们需要指定指向已定义回调函数的指针
是否有一种优雅的方式来编写此代码,类似于支持lambda表达式的高级OPP语言,例如:
SendRequest(param1, param2, function(int responseCode) { print(responseCode) });
如何才能最好地模拟这种行为?在标准C中,无法提供函数文本;函数指针必须指向顶级函数。也无法捕获未作为参数传递的局部变量 但是,为了增加(声称的)优雅性和降低可移植性(也可能降低可靠性): 在您的示例中,不需要中间变量
response\u callback
。在C语言中,typedef
s只是类型的别名,如果函数的签名与RESPONSE\u CALLBACK
的签名匹配,则可以直接使用函数名:
SendRequest(param1, param2, response_callback_function);
函数指针也不需要&
运算符。按照C的优雅标准,我觉得这已经足够优雅了
某些编译器(如gcc)实现嵌套函数,允许您在其使用位置附近定义函数:
if (print_flag) {
void func(int rc) { print(rc); }
SendRequest(param1, param2, func);
}
与的嵌套函数(也是仅支持的非标准扩展)可用于。我不认为该站点上显示的宏特别优雅,但如果您有回调类,例如事件处理程序,则可以简化宏(如果您愿意在整个过程中使用相同的硬编码参数名称):
这样称呼它:
SendRequest(param1, param2, handler({ print(rc); }));
(可以使大括号成为宏的一部分,但回调语句后的分号看起来很奇怪;我更喜欢大括号出现在客户机代码中。)
注意这似乎是一个碰巧可以使用的功能,而不是设计可以使用的功能。您不应该将封闭函数的任何局部变量用于回调,这些回调可能在这些变量的生命周期结束时调用。(它将编译,但会导致运行时错误。)请小心操作
有些编译器可能有针对真实lambda或函数文本的扩展,但我不知道有任何扩展
SendRequest(param1, param2, handler({ print(rc); }));