C 属性: nodiscard (C23 起)

来自cppreference.com
< c‎ | language‎ | attributes


若从转型到 void 以外的弃值表达式,调用声明为 nodiscard 的函数,或调用返回声明 nodiscard 的结构体/联合体/枚举的函数,则鼓励编译器发出警告。

语法

[[ nodiscard ]]
[[ __nodiscard__ ]]
(1)
[[ nodiscard ( 字符串字面量 ) ]]
[[ __nodiscard__ ( 字符串字面量 ) ]]
(2)
字符串字面量 - 能用于解释为何不应舍弃结果的原理的文本

解释

出现于函数声明、枚举声明或结构体/联合体声明。

若从转型到 void 以外的弃值表达式

  • 调用声明为 nodiscard 的函数,或
  • 调用返回声明 nodiscard 的结构体/联合体/枚举的函数,

则鼓励编译器发出警告。

若指定 字符串字面量 则通常包含它于警告中。

示例

struct [[nodiscard]] error_info { int status; /*...*/ };
struct error_info enable_missile_safety_mode() { /*...*/ return (struct error_info){0}; }
void launch_missiles() { /*...*/ }
void test_missiles() {
   enable_missile_safety_mode(); // 编译器可能在舍弃 nodiscard 值时警告
   launch_missiles();
}
struct error_info* foo() { static struct error_info e; /*...*/ return &e; }
void f1() {
    foo(); // 不以值返回 nodiscard 类型,无警告
}
// nodiscard( 字符串字面量 ):
[[nodiscard("PURE FUN")]] int strategic_value(int x, int y) { return x ^ y; }
 
int main()
{
    strategic_value(4,2); // 编译器可能在舍弃 nodiscard 值时警告
    int z = strategic_value(0,0); // OK: 未丢弃返回值
    return z;
}

可能的输出:

game.cpp:5:4: warning: ignoring return value of function declared with 'nodiscard' attribute
game.cpp:17:5: warning: ignoring return value of function declared with 'nodiscard' attribute: PURE FUN

参阅