C是否有一个[[nodiscard]]机制在值被忽略时发出警告?

voase2hg  于 2023-10-16  发布在  其他
关注(0)|答案(3)|浏览(87)

在C++中,我们可以用“nodiscribe”来修饰我们的返回类型,如果结果未被使用,它会触发编译器警告。
这对于强制执行错误代码特别有用

auto dont_forget_to_check = do_something_important();
assert(dont_forget_to_check);

这样的东西存在于C?

vngu2lb8

vngu2lb81#

没有标准的方法来做到这一点,但gcc确实支持warn_unused_result属性。

__attribute__ ((warn_unused_result))
int foo()
{
    return 5;
}

int main()
{
    foo();
    return 0;
}

编译器输出:

[dbush@db-centos7 ~]$ gcc -g -Wall -Wextra -o x1 x1.c
x1.c: In function ‘main’:
x1.c:11:8: warning: ignoring return value of ‘foo’, declared with attribute warn_unused_result [-Wunused-result]
     foo();
        ^
pkwftd7m

pkwftd7m2#

这样的东西存在于C?
还没有,但可能在C2x
C++11样式属性语法和nodiscardmaybe_unuseddeprecatedfallthrough属性。

pbpqsu0x

pbpqsu0x3#

从C23开始,你可以在函数、结构、联合和枚举上使用[[nodiscard]]属性。
我用GCC 13和Clang 16测试了它,用-std=c2x-std=gnu2x编译。

[[nodiscard]]
int fn();

struct [[nodiscard("warning message")]] S;

第二个例子在从函数返回S* 时没有警告。
不需要警告选项。警告可以用-Wno-unused-result来抑制,Clang也可以用-Wno-unused来抑制。
如果你想写一个宏,当使用的C标准低于C23时,用gcc属性替换它,你可以测试__STDC_VERSION__ < 202000

相关问题