C语言的复杂声明的使用场景是什么呢?

seymourbirkhoff
  • 194

请问大神:C语言的复杂声明的使用场景是什么呢? 为什么会用到这么复杂的声明呢?
比如这个声明
char ((x[3])())[5];

回复
阅读 2.4k
2 个回答

复杂声明是特性,但是使用的时候不一定非要用得那么复杂。

char (*x[3])(int a)

意思是x是一个长度为3个单位的数组,每个单位是一个函数指针,这个函数有一个为int的参数a,这个函数返回char

那么,可能还有更复杂的,不过我就以以上这个作为例子,看下实际写代码的时候,怎么一目了然。

typedef char func(int a);
typedef func *func_ptr;
func_ptr x[3];

你问的是现实的意义,其实现实代码中绝对不少比以上更复杂的封装,但是只要善用typedef,一切都能简化到一眼看懂。

图片描述
不知道你写的是不是char ((x[3])())[5],如果是的话,那就有问题了(不能声明函数数组)。

关于为什么会有很多复杂的声明的应用场景,那就很多了。
举个例子,在一个图像的RGBA四个通道的数据保存在一个ucharbuffer中,现在直到图像的高和宽,怎么比较优美的取出x行y列的alpha值呢?

// 这里假设图像为 256*128
uint8_t (*p)[128][4] = (uint8_t (*)[128][4])buf;
// 取x行y列的alpha值
uint8_t a = p[x][y][3];    // 因为RGBA,alpha在最后

再例如,你有一个任务调度队列,你可以把一些任务塞给它去执行。
那么它需要接受你传入的任务,通常那就是一个函数和函数的参数。
假设这个函数是一个读取文件的参数(fun1),读取完成之后这个函数要通知传入任务者或者进行下一步操作。那么这个fun1可以接受一个函数做参数,调用这个函数来告知读取已完成,进行下一步操作

// 通知函数
void notify();
// 读取文件的函数声明
int read_file(void(*)()/*传入通知函数*/);
// 入队函数声明
void add_task(int(*)(void())/*传入任务函数*/,void(*)()/*给任务函数的参数*/)

实际上一般不会这么做,这只是举个例子。

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
宣传栏