关于fallthrough

背景及问题

最近在从低版本的内核向高版本的内核移植驱动, 碰到了如下类似的报错:

error: this statement may fall through [-Werror=implicit-fallthrough=]

是与 fallthrough 相关的,查看代码,发现以前用的是:

/* fall through */

新版本的好像不行了,改为下面的就OK了:

fallthrough;

关于fallthrough

fallthrough属性主要用于switch语句中

如果当前case分支中不加break,便会继续执行下一个case分支的代码,而很多初学者容易犯这样的错误:在本应当在case分支中加入break的时候却忘了加。于是编译器会针对这种情况输出Warning信息,提醒可能忘了加break。但是有些时候我们为了实现一些特定的逻辑,不能加break,但是又不想看到编译器报的警告,该怎么办呢?此时fallthrough便派上用场了,在不加break的地方加上fallthrough

不同的编译器版本,对于fallthrough的写法要求是不一样的,例如以前gcc的版本,使用/* fall through */,现在较新的(如gcc 9.4)对这种写法就会报错,需改为fallthrough;