lint产生一些警告,如:
foo.c XXX Warning 534: Ignoring return value of function bar()
来自lint manual
534忽略功能的返回值
'符号'(与位置比较)A 返回值的函数是 仅仅因副作用而被称为 例如,在一个声明本身或 逗号的左侧 运营商。尝试:(void)function();至 调用一个函数并忽略它的返回 值。另见fvr,fvo和fdr §5.5“标志选项”中的标志。
我希望在编译期间收到此警告(如果存在)。 gcc / g ++中有没有选项来实现这个目的?我打开了-Wall
,但显然没有发现这一点。
答案 0 :(得分:27)
感谢WhirlWind和paxdiablo的回答和评论。这是我尝试将各个部分组合成一个完整的(?)答案。
-Wunused-result
是相关的gcc选项。并且默认情况下已启用。引自gcc warning options page:
-Wno-unused-result
如果标记有属性
warn_unused_result
的函数的调用者,请不要发出警告(请参阅 Variable Attributes)不使用其返回值。默认值为-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;
}
和相应的编译结果:
$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
再次注意没有必要使用-Wunused-result ,因为它是默认值。人们可能会试图明确地提及它以传达意图。虽然这是一个崇高的意图,但在分析了这种情况之后,我的选择却是反对的。因为,在编译选项中使用-Wunused-result
可能会产生错误的安全感/满意感,除非代码库中的所有函数都使用warn_unused_result
进行限定,否则这种感觉是不正确的。
答案 1 :(得分:16)
答案 2 :(得分:6)
-Wunused-result
应该为你做这件事。这不是警告之一 - 墙打开:
http://gcc.gnu.org/onlinedocs/gcc/Warning-Options.html
该函数必须应用warn_unused_result属性(感谢paxdiablo)。
答案 3 :(得分:4)
使用__attribute__((warn_unused_result))
的答案是正确的。但是,海湾合作委员会并不擅长这项功能!请注意:它不会警告非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;
}
所以,不要依赖于这种非常简单的退货类型。
答案 4 :(得分:-2)
我解决了这个问题:
#define ignore_result(x) if (x) {}
然后代替(void)foo()
使用ignore_result(foo())
然后代码用-Wall
编译就好了。