C ++:如何在函数返回值未使用时触发编译器错误?

时间:2011-04-27 11:52:40

标签: c++ compiler-errors return-value

假设我有一个规范化函数定义为:

Vec3f Vec3f::getNormalized() const {
   return (*this)/this->length();
}

如果使用此函数而没有存储其返回值的某些内容,是否可能以某种方式创建编译时错误? ;

v.getNormalized(); // which most definitely is a typo

..代替..

v = v.getNormalized(); 

4 个答案:

答案 0 :(得分:19)

在GCC中,当忽略函数的返回值时,使用-Wunused-result来触发警告。如果您想要错误而不是警告,请使用-Werror将所有警告转换为错误。有关详细信息,请参阅 GCC Warning Options

似乎没有对Visual C ++编译器的等效警告。 (如果我错了,请使用Visual C ++信息编辑此回复。)

答案 1 :(得分:6)

无法知道是否采用了返回值。保证传入一个的唯一方法是通过引用传递返回值。

答案 2 :(得分:3)

我不认为这在编译时是可行的,除非使用编译器标志@Ashwin noted

但是,如果可以在运行时生成错误,您可以使用一些技巧,例如使用代理类:

template <typename T>
struct Return
{
    Return(const T & value) 
      : value_(value), used_(false) 
    {}

    Return(const Return & other) 
      : value_(other.value_), used_(false) 
    { 
        other.used_ = true; 
    }


    Return & operator=(const Return & other)
    {
        other.used_ = true;
        value_ = other.value;
        return *this;
    }

    operator T() const 
    { 
        used_ = true; 
        return value_;
    }

    ~Return() // generates an error if the value hasn't been used
    { 
        assert(used_); 
    }

  private:

    T value_;
    mutable bool used_;
};

Return<int> foo()
{
    return 42;
}

int main()
{
    int i = foo();                   // ok
    std::cout << foo() << std::endl; // ok

    foo();                           // assertion failed
}

您只需要更改函数的返回类型,使其返回Return<Vec3f>,如果函数的结果未使用,则应该获得错误。但是,我不确定我会建议这样做,因为它会使代码不那么清晰,也可能被误用。只要您的功能有详细记录,您就应该对用户充满信心:)!

答案 3 :(得分:2)

使用clang,您可以选择性地将给定警告转换为错误(而不是全部)。

这是通过-Werror=foo来实现的,其中foo是警告的名称。在这里,我认为-Werror=unused-expr是你需要的。