C:这是类型铸造的正确案例吗?
当我编译以下代码(使用-Wall)时,没有收到任何警告,因为我将C:这是类型铸造的正确案例吗?,c,C,当我编译以下代码(使用-Wall)时,没有收到任何警告,因为我将*(str)+转换为void类型。但是,如果我不将该操作强制转换为void类型,则会出现以下警告:警告:未使用计算值[-Wunused value]这是消除编译器警告的正确方法吗 #include <stdio.h> static void print(char *str) { while(*str) { printf("%c\n", *str); (void)*(str)++; } } i
*(str)+
转换为void类型。但是,如果我不将该操作强制转换为void
类型,则会出现以下警告:警告:未使用计算值[-Wunused value]
这是消除编译器警告的正确方法吗
#include <stdio.h>
static void print(char *str)
{
while(*str) {
printf("%c\n", *str);
(void)*(str)++;
}
}
int main(void)
{
print("Hello");
return 0;
}
#包括
静态无效打印(字符*str)
{
while(*str){
printf(“%c\n”,*str);
(无效)*(str)+;
}
}
内部主(空)
{
打印(“你好”);
返回0;
}
消除这些编译器警告的正确方法是简单地执行str++代码>这是正确的,但是您没有必要取消引用--您不需要*(str++)
,只需要str++
。除此之外,你可能只是想
for(; *str; str++) {
printf("%c\n", *str);
}
相反
另请参见。当递增指针时,您不需要使用*
。您可以递增指针,取消对其旧值的引用,并且对结果不做任何处理。警告就是这么说的(void)
是将某事物标记为“已使用”的正确方法,即使它不起任何作用。但这里不需要它(事实上,它很少需要,通常在宏中)-因为不需要不使用的值,所以不需要首先取消引用指针。str++
仍然有一个返回值,这不应该修复它。执行此操作时,我不会收到警告。@RPM:您不会,这是有效的C.@quantdev我对gcc的工作原理有错误,因此它似乎确实停止了警告,但没有理由它应该--*(str++)
和str++
都返回一个值——前者返回一个char
,后者返回一个char*
@使用for
循环比使用随机挂起的str++
可以更清楚地解决RPM的问题。for循环中的str++也会做同样的事情。任何现代编译器都会为两个循环生成严格相同的机器代码:它们是相同的!无需读取具有副作用的运算符的返回值。编辑:但我很感激讨论这个问题,这是积极的!是的,C没有字符串,只有char*
s。字符串文字将是堆栈分配的char*
f(“某些字符串”)
与char[]tmp=“某些字符串”相同;f(tmp)
。通常在堆栈上找不到字符串文本char[]tmp=“一些字符串”如果tmp
是一个局部变量,则code>可能在堆栈上,但这是tmp
的位置,而不是字符串literal“some string”
的位置,如果它在内存中显式表示,可能在靠近代码的某个只读段中。@PascalCuoq我的错误,感谢您纠正我的错误。根据我的研究,char*str=“hello”
是一种分配为静态只读内存的内存。