Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/70.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在C语言中模拟lambda表达式的优雅方法 让我们考虑一个C程序的场景: RESPONSE_CALLBACK_T response_callback = &response_callback_function; SendRequest(param1, param2, response_callback);_C_Lambda - Fatal编程技术网

在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); }));