C 表达式中未使用的值

C 表达式中未使用的值,c,warnings,clang,C,Warnings,Clang,Clang似乎在警告我表达式中未使用字符,下面是整个代码部分: int yeller(const char * channel) { char *p, *q; q = p = MAKE_COPY(temp->bind_chan); while ((p = next_in_comma_list(q, &q))) { if (!p || !*p) break; if (!my_stricmp(p, channel)) return tmp; 具体而言,这一行: q = p = MAK

Clang似乎在警告我表达式中未使用字符,下面是整个代码部分:

int yeller(const char * channel) {
char *p, *q;
q = p = MAKE_COPY(temp->bind_chan);
while ((p = next_in_comma_list(q, &q))) {
if (!p || !*p)
break;
if (!my_stricmp(p, channel))
return tmp;
具体而言,这一行:

q = p = MAKE_COPY(temp->bind_chan);
虽然存储到“p”的值在封闭表达式中使用,但实际上从未从“p”读取该值


我显然是在while循环中对其进行评估,这真的是一个“bug”还是我做错了什么?

Clang暗示您的代码中可能有错误

代码将值赋给
p
,该值在被覆盖之前不会在任何地方使用,这看起来很奇怪,应该重新查看执行此操作的代码段。在随后的
while
循环中,您将覆盖
p
的内容,而不使用其先前的值

在以下代码中,此警告可能更安全:

Status status = do_some_job();
...
(some code where status isn't checked)
...
status = do_some_ther_job();

这很可能是程序员的错误,因为在大多数情况下,如果函数返回状态,则应该对其进行检查。

Clang提示您的代码中可能存在错误

代码将值赋给
p
,该值在被覆盖之前不会在任何地方使用,这看起来很奇怪,应该重新查看执行此操作的代码段。在随后的
while
循环中,您将覆盖
p
的内容,而不使用其先前的值

在以下代码中,此警告可能更安全:

Status status = do_some_job();
...
(some code where status isn't checked)
...
status = do_some_ther_job();

这很可能是程序员的错误,因为在大多数情况下,如果函数返回状态,就应该对其进行检查。

Clang试图说服您编写更好的代码,请听一听

我认为您的代码片段的语义最好使用以下内容

char *q = MAKE_COPY(temp->bind_chan);
for (char *p; (p = next_in_comma_list(q, &q));) {
 ...
}
这就是在可能的情况下使用初始化而不是赋值,并使迭代变量位于使用它的范围的局部


编辑:这使用了在acient C中没有的特性,也就是C89,但是在1999年引入到语言中。Clang应该可以很好地使用它,因为它在默认情况下使用C99。

Clang试图说服您编写更好的代码,请听

我认为您的代码片段的语义最好使用以下内容

char *q = MAKE_COPY(temp->bind_chan);
for (char *p; (p = next_in_comma_list(q, &q));) {
 ...
}
这就是在可能的情况下使用初始化而不是赋值,并使迭代变量位于使用它的范围的局部


编辑:这使用了在acient C中没有的特性,也就是C89,但是在1999年引入到语言中。Clang应该可以很好地使用它,因为它默认使用C99。

给出Clang吐出的确切错误。我甚至不明白你为什么问。编译器告诉您,您对
p
的第一次赋值是多余的。这毫无意义,所以把它去掉。给出准确的错误,我甚至不明白你为什么问。编译器告诉您,您对
p
的第一次赋值是多余的。这完全没有意义,所以请删除它。FWIW上面的内容仅适用于c99模式。您所说的“仅”c99模式是什么意思?当前的C标准是C11.FWIW,以上仅适用于c99模式。您所说的“仅”c99模式是什么意思?当前的C标准是C11。