如果在GCC 4.4.7上未使用返回值,则强制调用类操作符==失败

时间:2016-02-25 17:50:59

标签: c++ gcc

我想知道如果结果对结果没有任何效果,是否有办法将类operator==的使用转换为编译器错误。原因是当开发人员打算使用operator==时,可以使用operator=

我不关心解决方案是否是GCC特定的,只要它适用于GCC 4.4.7。解决方案可以包括GCC特定的属性,编译器编译指示或下面给出的C ++类上的源代码文件更改。对编译器选项的更改不太有吸引力。

见下面的例子。取消注释下面的#define DO_STRING_LITERAL_TEST行,您将看到来自编译器的有用消息:

/usr/bin/g++  -MD -DDEBUG -g -ggdb -gstabs+ -O0  -fPIC  -Wall -Werror -Wsynth -Wno-comment -Wreturn-type   main.cpp -c -o main.o
cc1plus: warnings being treated as errors
main.cpp: In function ‘int main(int, char**, char* const*)’:
main.cpp:37: error: comparison with string literal results in unspecified behaviour

评论#define DO_STRING_LITERAL_TEST行,然后取消注释#define DO_STRING_CONTAINER_TEST行。编译得很好,我希望它在指示的行上失败:

foo == " "; // <-- I need this to throw a compiler error

以下是示例代码:

#include <iostream>
#include <string>

class StringContainer {
private:
  std::string _val;

public:
  StringContainer(const char * inString = NULL) : _val(inString ? inString : "") {}

  bool operator==(const StringContainer & other) const
  {
    return _val == other._val;
  }

  void operator=(const char * other)
  {
    _val = other;
  }

  const char * getString() const
  {
    return _val.c_str();
  }

};

int main(int argc, char *argv[], char *const envp[])
{
  std::cout << __FILE__ << ":" << __LINE__ << ":" << "main begin" << std::endl;

#define DO_STRING_LITERAL_TEST
#ifdef DO_STRING_LITERAL_TEST
  const char * invalidval = "foo bar";
  // The following use of == throws a nice compiler error on GCC 4.4.7:
  invalidval == " ";
#endif // DO_STRING_LITERAL_TEST


//#define DO_STRING_CONTAINER_TEST
#ifdef DO_STRING_CONTAINER_TEST
  StringContainer foo;
  foo = "some string";
  foo == " "; // <-- I need this to throw a compiler error
  std::cout << __FILE__ << ":" << __LINE__ << ":" << "foo contains <" << foo.getString() << ">" << std::endl;
#endif // DO_STRING_CONTAINER_TEST


  std::cout << __FILE__ << ":" << __LINE__ << ":" << "main end" << std::endl;
  return 0;
} // end main

一个答案非常接近https://stackoverflow.com/a/12416677/257924。但是这指定使用一个看起来很有吸引力的函数属性,但是我需要在使用-Werror=unused-result时使用balks的GCC编译器的版本:

cc1plus: error: -Werror=unused-result: No option -Wunused-result

如果暂时(对某些代码段,可能是)unused-result警告只有源代码更改,那就更好了。 https://freeswitch.org/jira/browse/FS-6850#commentauthor_55299_verbose显然表示&#34;与gcc 4.8.3相同的测试通过,因为它支持参数。&#34;

2 个答案:

答案 0 :(得分:1)

这不应该是您在代码中验证的内容。这应该是您的编译器将为您做的事情。如果您需要std::string,则应使用std::string - 而不是MyStringThatHasThisExtraEqualityCheck

我建议以下几点之一:

  • 您最喜爱的gcc开发人员根据this bug report
  • 让他们实施-Wunused-comparison
  • 只需使用clang编译代码,它确实支持该警告。然后,您可以添加-Werror以使其成为错误。你不需要运行clang二进制文件,但额外的正交不会受到伤害(只为slack off提供更多借口)。
  • 使用一些外部静态分析工具为您验证这些内容。
  • 编写单元测试。

答案 1 :(得分:1)

GCC允许函数public class Touch extends AppCompatActivity implements OnTouchListener,OnClickListener { private button boutonCompteur = null; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.id.Compteur); boutonCompteur = (button) findViewById(R.id.Compteur); boutonCompteur.setOnTouchListener(this); boutonCompteur.setOnClickListener(this); } @Override public boolean onTouch(View v, MotionEvent event) { return true; } } 。你有没有尝试过你班级的比较器?

编辑:没关系。跳过你说你的旧GCC版本仍然不支持该属性的部分。