void(*signal(int, void (*)(int)))(int);
里面的部分是接收一个 int 和 一个函数指针, 这个是清楚的, 第一个 void 跟括号是什么意思...为什么最后还有一个 int 看不懂了....
1
zivyou 2020-05-28 16:50:18 +08:00
void (*)(int) 是一个类型(函数指针);
signal(int, void (*)(int)) 是一个函数的定义 void(*signal(int, void (*)(int)))(int); 是一个类型给这个类型赋值。 最后的结果,signal 是一个函数指针,它的类型是 void( void(*)(int, void(*)(int))) (int) |
2
zivyou 2020-05-28 16:52:22 +08:00
@zivyou void(*signal(int, void (*)(int)))(int); 是一个类型给这个类型赋值。 => 是定义某个类型的变量
|
3
Vibra OP void (*)(int) 是一个类型(函数指针);
signal(int, void (*)(int)) 是一个函数的定义 这两个能看懂,,,然后接下来 *signal 是什么意思? 我理解的是, signal 的返回值是一个指针,,,就是 signal 前面的*,,但是*没有声明类型... 还有,,,给指针赋类型, 不应该是括号写前面吗? 比如 int *a = (int *) malloc(sizeof(int)); 这样... |
4
ho121 2020-05-28 16:58:58 +08:00 via Android 1
void(*signal(int, void (*)(int)))(int);
这句是一个函数声明,signal 是函数名,接受的参数类型是(int, void (*)(int)),返回值类型是 void (*)(int) |
5
Vibra OP @zivyou 这个 void( void(*)(int, void(*)(int))) (int) 最后一个 int 是什么意思
|
6
Vibra OP @ho121 意思是, 返回值还是一个函数指针是吗?
`signal(SIGALRM, wakeup);` 这个代码是可以通过的, 然后这个 `signal(SIGALRM, wakeup)(0);`可以编译通过, 运行不成功 [1] 49420 segmentation fault ./a.out |
8
whoami9894 2020-05-28 17:18:09 +08:00
就是#4 的答案
```c void t(int i) { printf("%d\n", i); } void(*signal(int i, void(*f)(int)))(int i) { f(i); return &t; } int main() { signal(0, &t)(1); return 0; } ``` |
9
Vibra OP @whoami9894 是的, 是 4 的答案,,我现在已经明白了..感谢感谢
|
10
wangyzj 2020-05-28 17:35:13 +08:00
@whoami9894 #8 这段没问题,楼主调用(int)有问题看看其他代码把
|