gpt4 book ai didi

c - void (func)(void) 和 void (*func)(void) 声明为结构字段内的字段时的区别?

转载 作者:行者123 更新时间:2023-12-05 01:49:11 27 4
gpt4 key购买 nike

所以我被告知它们彼此几乎相同

void function1 (void(func)(int), int arg){
func(arg);
}

void function2 (void(*func)(int), int arg){
func(arg);
}

当我执行它时,它没有抛出任何错误。

void print_plus_1(int p)
{
printf("p=%d\n", p+1);
}

void print_plus_2(int p)
{
printf("p=%d\n", p+2);
}


int main(void)
{
function1(print_plus_1, 1);
function2(print_plus_2, 1);

}

但是,当我在结构中初始化相同的 void (func) (int) 与 void (*func) (int) 模式时

struct foo
{
void (func1)(int);
void (*func2)(int);
};


void print_plus_1(int p)
{
printf("p=%d\n", p+1);
}

void print_plus_2(int p)
{
printf("p=%d\n", p+2);
}

int main(void)
{
struct foo f;
f.func1 = print_plus_1;
f.func2 = print_plus_2;
return 0;
}

它会引发编译错误?

error: field 'func1' declared as a function
void (func1)(int);

为什么 void (func)(void) 在写为回调函数而不是结构内的字段时有效?

最佳答案

名义上,void (func)(int) 声明一个接受 int 且不返回任何内容的函数,而 void (*func)(int ) 声明指向此类函数的指针。

在标准的 C 语言中,函数不是对象。它们不能分配给变量、作为参数传递或存储在结构成员中。

但是,C 2018 6.7.6.3 8 说:

A declaration of a parameter as “function returning type” shall be adjusted to “pointer to function returning type”, as in 6.3.2.1.

这意味着,当您将参数声明为函数时,它会自动更改为将参数声明为指向函数的指针。 C 标准中没有任何内容说明在声明结构成员时要进行此调整。这就是为什么您可以名义上(但不是实际上)将函数参数声明为函数但不能将结构成员声明为函数的原因。

关于c - void (func)(void) 和 void (*func)(void) 声明为结构字段内的字段时的区别?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/74417440/

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