gpt4 book ai didi

我能以某种方式在 ANSI C 中使用嵌套函数吗?

转载 作者:太空宇宙 更新时间:2023-11-04 01:44:29 25 4
gpt4 key购买 nike

我有高级语言背景,例如 Java/Kotlin/Scala。现在我需要创建一个 C 库,但没有闭包对我来说很难工作。

GCC 中有一个很好的扩展,称为“嵌套函数”,(如果我理解正确的话)正是我所需要的。 Apple“ block ”扩展看起来也很有趣。但我需要一个适用于任何编译器的代码。

是否存在任何现有解决方案?我见过一些允许生成 C 代码的项目:https://github.com/dbohdan/compilers-targeting-c .但我真的不需要另一种语言,只需要一个特性——闭包。 (我认为很难维护完全不同的语言,结果 C 代码将不会被优化)。

UPD一些解释,为什么我需要闭包。

假设我们有一些函数,connect(void (*on_failed_callback)());。它以某种方式管理连接,当连接丢失时,它调用回调。它需要 0 个参数,但我想创建一些函数来带回一些数据。如果我理解正确,最常用的解决方案是使用一些参数 connect(void (*on_failed_callback)(void *callback_arg), void* arg); 来传递回调。但它会导致样板代码,可以通过嵌套函数修复。

接下来的代码:

void connect(void (*on_failed_callback)(void* arg), void* arg) {
...
on_failed_callback(arg);
}

void print_error(char* error) {
printf(error);
}

void main() {
char *msg = "Failed connection";
...
connect(print_error, msg);
}

可以简化为下一个:

void connect(void (*on_failed_callback)()) {
...
on_failed_callback();
}

void print_error(char* error) {
printf(error);
}

void main() {
char* msg = "Failed connection";
...
void callback() {
print_error(msg);
}
connect(callback);
}

我的意思是,我想要一些工具/应用程序,它可以使用闭包/嵌套函数分析我的代码并生成纯 ANSI C 代码。

最佳答案

对于您询问的具体示例,有一种 C 方法可以实现类似于闭包的功能,因为它将函数指针与函数需要使用的数据打包在一起。

typedef struct {
char sBuff[128]; // data for the function to use
void (* func) (char* error); // pointer to function to execute
} ErrorMsg;

void connect(ErrorMsg myMsg) {
...
myMsg.func(myMsg.sBuff); // call the function with the packaged data
}

// the function that we will be encapsulating with the data to be
// used.
void print_error(char* error) {
printf(error);
}

void main() {
ErrorMsg msg = {"Failed connection", print_error} ;

connect(msg); // invoke our function package and its data.
}

如果在使用功能包的时候,你想添加额外的数据,你可以按照下面的方式进行。

typedef struct {
char sBuff[128]; // packaged data for the function to use
void (* func) (char* error, int iExtra); // pointer to function to execute
} ErrorMsg;

void connect(ErrorMsg myMsg) {
...
myMsg.func(myMsg.sBuff, errno); // call the function with the packaged data and extra info
}

// the function that we will be encapsulating with the data to be
// used.
void print_error(char* error, int iExtra) {
printf(error, iExtra);
}

void main() {
ErrorMsg msg = {"Failed connection: errno %d", print_error} ;

connect(msg); // invoke our function package and its data.
}

关于我能以某种方式在 ANSI C 中使用嵌套函数吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56361597/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com