【发布时间】:2019-06-29 19:35:12
【问题描述】:
想象一下:
#define OK 0
#define ERROR -1
int foo(void) {
int rv = OK;
rv = bar();
return rv;
}
在这种情况下,cppcheck 会将行 int rv = OK; 标记为带有 Message: Variable 'rv' is reassigned a value before the old one has been used. 的冗余分配
我想知道为什么会这样,我认为初始化变量是正确的做法,不是吗?
【问题讨论】:
-
如果
rv在后者之前未使用,则警告是合法的。在两者之间放置一个printf("%d\n", rv);,看看该工具现在是否考虑代码声音(它最好)。您完全按照所示编写的代码会更好,就像int rv = bar();一样,这就是警告试图告诉您的全部内容。 -
在某些情况下,初始化可能是有害的,因为它会隐藏一些不相关的未初始化变量的使用,但设置为 init 值。我个人不喜欢使用虚拟值进行初始化(正如许多编码规则所要求的那样),因为它们会阻止您利用现代工具。此外,在您的情况下,我至少希望它设置为 ERROR,因为绝对没有理由让代码在什么都不做时返回成功。但这只是我的意见......
-
您可以将函数缩减为
int foo(void) { return bar(); },完全避免rv。 (你甚至可以考虑使用static inline int foo(void) { return bar(); }。)如果做不到这一点,你可以使用int foo(void) { int rv = bar(); return rv; }。如果您使用调试器单步执行代码,这将具有一些优势。
标签: c variables initialization coding-style cppcheck