switch语句具有命令来管理其流程,这些命令是break[[fallthrough]]
break强制流程从switch跳出,并且[[fallthrough]]继续执行忽略大小写验证的命令(实际上这是switch的默认行为)。例如:

switch (x) {
       case 0:
              ...statements...
              break;             //will jump to (...after switch statements...)
       case 1:
              ...statements...
              [[fallthrough]];   //don't jump
       case 2:
              ...statements...   //will be executed if x == 1 or x == 2
}
...after switch statements...

如果没有[[fallthrough]],为什么用方括号定义break

*命令[[fallthrough]]是在C++ 17中引入的,如站点cppreference所示。

最佳答案

这是一个属性。这些属性已经存在于诸如GCC之类的编译器中,以提供对该语言的扩展。它可以像__attribute__((<attribute_name>))一样使用。他们认为这不仅难以理解,而且在其他方​​面也存在问题,因此他们引入了[[<attribute>]]语法以确保c++ 11中的清晰度和更好的安全性。

因此,请务必注意,此双方括号不仅适用于fallthrough,而且适用于许多其他属性,例如noreturncarries_dependency。有关更多信息,请参见this

更新:一个有趣的注意事项:在LLVM源代码中,有一个如下所示的宏:

/// LLVM_FALLTHROUGH - Mark fallthrough cases in switch statements.
#if __cplusplus > 201402L && LLVM_HAS_CPP_ATTRIBUTE(fallthrough)
#define LLVM_FALLTHROUGH [[fallthrough]]
#elif LLVM_HAS_CPP_ATTRIBUTE(gnu::fallthrough)
#define LLVM_FALLTHROUGH [[gnu::fallthrough]]
#elif __has_attribute(fallthrough)
#define LLVM_FALLTHROUGH __attribute__((fallthrough))
#elif LLVM_HAS_CPP_ATTRIBUTE(clang::fallthrough)
#define LLVM_FALLTHROUGH [[clang::fallthrough]]
#else
#define LLVM_FALLTHROUGH
#endif

很好,它也在其中使用了[[fallthrough]],但是如果它的较老的c++编译器支持__attribute__((fallthrough)),也可以观察到它是如何使用的。

10-07 16:38