该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...
Run Code Online (Sandbox Code Playgroud)
[[fallthrough]]如果break不是,为什么用方括号定义?
*该命令[[fallthrough]]是在 C++17 中引入的,如站点cppreference 所示。
这是一个属性。这些属性已经存在于像 GCC 这样的编译器中,用于对语言进行扩展。它可以像__attribute__((<attribute_name>)). 他们认为这不仅难以阅读,而且在其他方面也存在问题,因此他们[[<attribute>]]在 c++11 中引入了这种语法以提高清晰度和安全性。
因此,重要的是要注意,这个双方括号不仅适用于fallthrough,而且适用于许多其他属性,例如noreturn和carries_dependency。有关更多信息,请参阅此内容。
更新:只是一个有趣的注意事项:在 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
Run Code Online (Sandbox Code Playgroud)
好吧[[fallthrough]],它也在其中使用了,但是__attribute__((fallthrough))如果它是支持此功能的较旧的 c++ 编译器,则还可以观察到如何使用它。