c++17的注解
C++17提供了三个注解,分别是[[fallthrough]], [[nodiscard]]和[[maybe_unused]]
1.[[fallthrough]]
用于switch-case中,在某个case分支执行完毕之后,如果没有break语句,则编译器可能会给出一个警告。但是有时这是开发者有意为之,为了让编译器明确知道开发者的意图,可以在需要某个case分支贯穿的地方(上个case没有break语句)显式的设置[[fallthrough]]标记。示例如下:
switch (type)
{
case 1:
func1();
// 这个位置缺少break语句,且没有fallthrough标注,可能是一个逻辑错误,在编译时编译器可能会给出警告,以提醒修改
case 2:
func2();
// 这个位置缺少break语句,且有fallthrough标注,是开发者有意为之,在编译时编译器不会给出任何警告
case 3:
func3();
}
2.[[nodiscard]]
一般用于修饰函数,告诉函数调用者必须关注函数的返回值(即不能丢弃该函数的返回值)。如果函数的调用者未将该函数的返回值赋值给一个变量,则编译器给出一个警告。
3.[[unused]]
在通常的情况下,编译器回怼程序代码中未使用的函数或者变量给出警告,另一些编译器直接不允许通过编译。在C++17之前,为了消除这些未使用的变量带来的编译告警或者错误,要么修改编译器的告警选项设置,要么定义一个类似于UNREFERENCED_PARAMETER的宏来显式调用这些未使用的变量一次,来消除警告或者错误:
#define UNREFERENCED_PARAMETER(x) x
int add (int a, int b, int c)
{
UNREFERENCED_PARAMETER(a);
UNREFERENCED_PARAMETER(b);
// 无关代码省略
}
但是在C++17中,直接使用注解的方式
int add ([[maybe_unused]]int a, [[maybe_unused]]int b, int c)
{
// 无关代码省略
}