gpt4 book ai didi

C99:使用不同数量的参数转换回调

转载 作者:行者123 更新时间:2023-12-03 17:06:13 25 4
gpt4 key购买 nike

在下面的示例中,我在指向应接收参数的函数的指针中创建了一个没有参数的函数的 CAST。假设它给出了预期的结果,这个过程是否有可能导致一些故障?
在线测试:https://onlinegdb.com/SJ6QzzOKI

typedef void (*Callback)(const char*);
Callback cb;

void inserisce_cb(void* c) {
cb=c;
}

void esegue_cb(){
cb("pippo");
}

void scriveTitolo(const char* titolo) {
Uart_Println(titolo);
}

void scriveTitolo2() {
Uart_Println("pluto");
}

void main(){
inserisce_cb(scriveTitolo);
esegue_cb();
inserisce_cb(scriveTitolo2);
esegue_cb();
}

最佳答案

将指向函数的指针转换为指向函数的另一个指针由 c 标准定义,但根据 C 6.3.2.3 8,使用结果指针调用具有不兼容类型的函数并非如此:

A pointer to a function of one type may be converted to a pointer to a function of another type and back again; the result shall compare equal to the original pointer. If a converted pointer is used to call a function whose type is not compatible with the referenced type, the behavior is undefined.



声明 void scriveTitolo2() { … }定义一个没有参数类型列表的函数(它使用标识符列表的旧 C 样式,该列表为空)并且不带参数。一个 Callback指针指向一个函数,该函数具有参数类型列表并采用 const char *争论。根据 C 2018 6.7.6.3 15,这些不兼容:

For two function types to be compatible,… If one type has a parameter type list and the other type is specified by a function definition that contains a (possibly empty) identifier list, both shall agree in the number of parameters,…



由于它们在参数数量上不一致,因此它们不兼容。

以上只讲了从 void (*)()转换过来的问题至 void (*){const char *)并使用结果调用函数。有一个单独的问题是函数指针被传递给 inserisce_cb ,它接受类型为 void * 的参数,它是一个指向对象类型的指针。 C 标准没有定义将指向函数类型的指针转​​换为指向对象类型的指针的行为。为了解决这个问题, inserisce_cb应该声明为一个指向函数类型的指针,例如 void inserisce_cb(Callback c) .

scriveTitolo2可以更改,那么兼容性问题可以通过更改为 const char *来解决。未使用的参数,将其定义更改为 void scriveTitolo2(const char *) .

(请注意,最好将 scriveTitolo2 与现代 C 风格声明为 void scriveTitolo2(void) { … } ,而不是没有 void 。这与问题无关,因为它不会使函数类型兼容,但是这种格式在许多情况下,声明为编译器提供了更多信息。)

关于C99:使用不同数量的参数转换回调,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61519555/

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