4

最近,由于拼写错误、逗号运算符、默认值的组合,我偶然发现了一个错误。一个术语有很多括号和逗号。一个逗号放在一个括号里太远了。该术语仍然是有效的 C++ 代码,但返回的值是错误的。在简化版本中,错误如下所示:

int intValue = MyString.toInt(),16;

该方法toInt有一个基于数字的默认参数(默认为 10)。该变量intValue将始终为 16。

所以问题是,是否有任何样式指南规则来避免此类错误或 c++ 检查器/编译器规则来帮助在代码中查找此类错误?

编辑

好的,我已经稍微更改了代码以使逗号更有意义:

char * MyString("0x42");
int intValue = stringToInt(MyString),16;

PS 请不要怪我没有使用 std::string 和流。该代码仅用于简化演示。:-)

4

2 回答 2

5

使用 GCC,-Wunused-value在这种情况下应该给出警告,因为MyString.toInt()没有使用的返回值。该标志应该有助于避免大多数此类错误。要实际获得警告可能需要将__attribute__ ((warn_unused_result))属性添加到toInt方法中。

在任何情况下,如所示的简化示例会导致“在数字常量之前出现预期的非限定 ID”编译错误,除非按如下方式添加括号int intValue = (MyString.toInt(),16);

于 2013-08-02T08:29:31.890 回答
3

我要做的是:

  • 可读性和清晰度永远是第一位的。不要将几个简单的表达式组合成一个复杂的表达式。相反,保持简单。您发布简化代码而不是实际版本的事实让我感到害怕。任何过于复杂而无法在此处发布的内容都不应该出现在您的代码中。
  • 不要使用默认参数。我没有发现它们为它们减去的可读性增加了太多价值。
  • 不要使用逗号运算符

此外,执行代码审查(仅仅存在逗号运算符就应该触发审查评论);单元测试你的代码;并使用断言来表达前置条件和后置条件。

如果你遵循这个建议,在你输入代码之后再阅读你的代码会让错误的行在你眼前尖叫。

于 2013-08-02T08:22:14.613 回答