# C 属性： nodiscard (C23 起)

< 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( string-literal ):
    [[nodiscard("PURE FUN")]] int strategic_value(int x, int y) { return x ^ y; }

    int main()
    {
        strategic_value(4,2); // compiler may warn on discarding a nodiscard value
        int z = strategic_value(0,0); // OK: return value is not discarded
        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

### 参阅