类型解释

写在前面

写这部分是为了:

  • 读懂复杂且恶心的类型声明,比如 void (*signal(int, void (*fp)(int)))(int);
  • 考试

记住要:

  • 不写这种不符合规范,并且恶心他人的声明
  • 多用 using 以及 STL 封装好的类型,适度用 typedef
  • 对恶心的写法说 no

推荐这个网站,能帮你把 C 类型声明翻译成自然语言:

cdecl: C gibberish ↔ English

变量声明说明符

本文中,我们只关心如下几种说明符,因为这几种说明符是最困难的部分:

  • *: 指针
  • []: 数组
  • (): 括号(改变声明优先级)或者 函数指针
  • &: 引用

优先级

括号括住的部分 > 后缀说明符 > 前缀说明符

读声明

优先级规律总结出来其实就是 右左法则,或者叫 clockwise/spiral Rule

法则内容如下:

从唯一的未定义的标识符开始

声明语句中,有且仅有一个之前没定义过的标识符。我们就从这个标识符开始。

int ((*fp)[MAXN])(int x, int y);

上例就是 fp

先看右边的声明符,再看左边

因为后缀说明符优先级更高,所以先看右边。

将看到的声明符转译为英文

看到了哪个声明符,就将如下列出的翻译模板加到我们当前的翻译栈中。

指针 / 引用:a pointer / reference to

数组:an array of

函数:a function passing (params) returning a

遇到非函数指针的括号就换方向

意思就是必须将当前括号里面的声明处理完毕才能跳出去。这是为了保证括号的优先级。

参考资料

如何解释复杂的 C/C++ 声明 - 知乎

c 语言中的复杂声明_c++ 数组复杂声明 读法-CSDN博客

复杂的指针_复杂的指针问题-CSDN博客

Clockwise/Spiral Rule

parsing - C isn’t that hard: void ( *( *f[] ) () ) () - Stack Overflow

📝笔记:使用Clockwise/Spiral Rule技巧轻松读懂变量/函数声明 | RealCat

cdecl: C gibberish ↔ English