c++ - 为什么'[[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所示。
解决方案
这是一个属性。这些属性已经存在于诸如 GCC 之类的编译器中,用于对语言进行扩展。它可以像__attribute__((<attribute_name>))
. 他们认为这不仅难以阅读,而且在其他方面也存在问题,因此他们[[<attribute>]]
在 c++11 中引入了这种语法以提高清晰度和更好的安全性。
所以重要的是要注意,这个双方括号不仅适用于fallthrough
,而且适用于许多其他属性,例如noreturn
and 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))
推荐阅读
- mariadb - 如何防止 MariaDB 自动完成中间查询?
- html - 如何在传单中制作水平图例?
- php - 如何在 php 中对重音字母进行排序,因为它们没有重音?
- python-3.x - 从 python tkinter 代码创建可执行文件
- google-maps-api-3 - Google Direction API 使用 10 位数字响应 waypoint_order
- android - 如何设计一个recyclerview,每个项目在andorid的imageview旁边包含2个按钮
- javascript - 对象的对象总是返回未定义的 $.each
- python - 执行 pathos.multiprocessing 功能时 Kivy 应用程序克隆/无响应
- javascript - Chrome Devtool 控制台中关于 {} + 0 的结果
- c - “有效类型”的解释?