假设我有一个规范化函数定义为:
Vec3f Vec3f::getNormalized() const {
return (*this)/this->length();
}
如果使用此函数而没有存储其返回值的某些内容,是否可能以某种方式创建编译时错误? ;
v.getNormalized(); // which most definitely is a typo
..代替..
v = v.getNormalized();
答案 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
是你需要的。