为什么“[[fallthrough]]”需要方括号“[[]]”?

The*_*ect 7 c++ c++17

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

Era*_*lon 6

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

因此,重要的是要注意,这个双方括号不仅适用于fallthrough,而且适用于许多其他属性,例如noreturncarries_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++ 编译器,则还可以观察到如何使用它。

  • @TheArquitect 如果它被设为关键字,那么每个具有名为“fallthrough”的变量的程序将不再编译。C++ 委员会非常努力不破坏数十年的现有软件。再说一次,它不是一个关键字,这样说并不代表它是真的。 (7认同)