sách gpt4 ai đã đi

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

In lại 作者:行者123 更新时间:2023-12-05 01:49:11 27 4
mua khóa gpt4 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;
trả về 0;
}

它会引发编译错误?

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

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

1 Câu trả lời

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

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

但是,C 2018 6.7.6.3 8 说:

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

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

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

27 4 0
行者123
Hồ sơ cá nhân

Tôi là một lập trình viên xuất sắc, rất giỏi!

Nhận phiếu giảm giá Didi Taxi miễn phí
Mã giảm giá Didi Taxi
Giấy chứng nhận ICP Bắc Kinh số 000000
Hợp tác quảng cáo: 1813099741@qq.com 6ren.com