编码风格aginst警告检查
在全新的编译警告,我遇到了下面的代码:编码风格aginst警告检查
char *strcpy(char *dest, char *src)
{
unsigned int i;
while(dest[i] = src[i])//assignment in condition
i++;
return dest;
}
代码的基础功能应该是美好的,但编译器警告说,assignment in condition
,请问这部分代码有任何潜在的风险?如果这种警告需要清理?
各种警告,需要清理。引入
此警告的原因=
和==
往往是来自程序员(你好,帕斯卡!)糊涂了,你的意图可以通过添加围绕赋值表达式的括号中明确指出:
if ((x = y)) // no warning
不,你不需要解决这个问题。
警告的原因是,有时人们错误地键入=
时,他们的意思是==
,例如,
while (response = 'n')
在有条件的转让是更可能是这样的错误不是分配要测试其值,所以编译器警告一下。您可以通过在测试包分配沉默警告:
while ((dest[i] = src[i]) != 0)
在另一方面,我建议你总是把while
或if
的体内{}
,哪怕它只是一个声明。见Why is it considered a bad practice to omit curly braces?
您还需要初始化i
:
unsigned int i = 0;
我想第二个他的意见。尽管在条件内进行赋值是合法的,但它使代码难以阅读。如果您的意图更明确,编译器优化器可能会生成相同的代码。多年前(几十年前),开发人员可以通过使用某些短手来帮助优化代码。这不再是事实。 – 2014-10-17 02:20:01
糟糕的做法中最糟糕的是“不需要解决这个问题”。在之前的“成功”构建中留下的大量不太重要的警告中,您永远不会注意到实际问题。 – user3125367 2014-10-17 02:34:49
虽然这可能是一般的真实情况,但这个特定的一个有一些值得注意的误报。考虑常见的'while(row = fetch_from_db())'模式。 – Barmar 2014-10-17 02:47:29
对于我的情况,我也尝试'while((dest [i] = src [i]))' – 2014-10-17 03:15:42