g ++如何在忽略函数返回值时发出警告

时间:2010-05-20 01:38:07

标签: c++ gcc g++ return-value compiler-warnings

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,但显然没有发现这一点。

5 个答案:

答案 0 :(得分:27)

感谢WhirlWindpaxdiablo的回答和评论。这是我尝试将各个部分组合成一个完整的(?)答案。

-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)

从C ++ 17开始,您可以使用[[nodiscard]] attribute

示例:

[[nodiscard]] int bar() {
  return 42;
}

答案 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编译就好了。