首页 > 解决方案 > 为什么'[[fallthrough]]'需要方括号'[[]]'?

问题描述

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所示。

标签: c++c++17

解决方案


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

所以重要的是要注意,这个双方括号不仅适用于fallthrough,而且适用于许多其他属性,例如noreturnand 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

好吧,它也使用了in 它,但如果它的旧 c++ 编译器支持[[fallthrough]]它,也可以观察到它是如何使用的。__attribute__((fallthrough))


推荐阅读