Aru*_*run 26 c++ gcc g++ return-value compiler-warnings
lint产生一些警告,如:
foo.c XXX Warning 534: Ignoring return value of function bar()
Run Code Online (Sandbox Code Playgroud)
来自lint 手册
534忽略功能的返回值
'符号'(与位置比较)返回值的函数仅针对副作用调用,例如,在语句本身或逗号运算符的左侧.尝试:(void)function(); 调用函数并忽略其返回值.另请参见§5.5"标志选项"中的fvr,fvo和fdr标志.
我想在编译期间得到这个警告,如果有的话.gcc/g ++中有没有选项来实现这个目的?我打开了,-Wall但显然没有发现这一点.
Aru*_*run 27
感谢WhirlWind和paxdiablo的回答和评论.这是我尝试将各个部分组合成一个完整的(?)答案.
-Wunused-result 是相关的gcc选项.并且它在默认情况下开启.从gcc警告选项页面引用:
-Wno-unused-result如果标记有属性的函数的调用者
warn_unused_result(请参阅变量属性)不使用其返回值,请 不要发出警告.默认是-Wunused-result
因此,解决方案是warn_unused_result在函数上应用属性.
这是一个完整的例子.文件unused_result.c的内容
int foo() { return 3; }
int bar() __attribute__((warn_unused_result));
int bar() { return 5; }
int main()
{
foo();
bar(); /* line 9 */
return 0;
}
Run Code Online (Sandbox Code Playgroud)
和相应的编译结果:
$gcc unused_result.c
unused_result.c: In function ‘main’:
unused_result.c:9: warning: ignoring return value of ‘bar’, declared with attribute warn_unused_result
Run Code Online (Sandbox Code Playgroud)
请再次注意,没有必要使用-Wunused-result,因为它是默认值.人们可能会试图明确地提及它以传达意图.虽然这是一个崇高的意图,但在分析了这种情况之后,我的选择却是反对的.因为,-Wunused-result在编译选项中有可能会产生错误的安全感/满意感,除非代码库中的所有函数都符合条件,否则这种感觉是不正确的warn_unused_result.
Jya*_*aif 18
从C++ 17开始,您可以使用该[[nodiscard]]属性.
例:
[[nodiscard]] int bar() {
return 42;
}
Run Code Online (Sandbox Code Playgroud)
小智 7
关于使用的答案__attribute__((warn_unused_result))是正确的。不过,GCC 不太擅长这个功能!请注意:它不会对非 POD 类型发出警告。这意味着,例如,如果您返回带有析构函数的类(或带有析构函数的实例变量的类),您将永远不会看到有关忽略结果的警告。
相关错误:https : //gcc.gnu.org/bugzilla/show_bug.cgi?id=66177
失败的例子:
struct Error {
~Error();
};
__attribute__((warn_unused_result)) Error test();
int main()
{
test();
return 0;
}
Run Code Online (Sandbox Code Playgroud)
因此,对于不是很简单的返回类型,不要依赖它。
-Wunused-result应该为你做这件事.这不是警告之一 - 墙打开:
http://gcc.gnu.org/onlinedocs/gcc/Warning-Options.html
该函数必须应用warn_unused_result属性(感谢paxdiablo).