-Wpedantic错误的类型参数在强制转换后递增
我有一个类似的代码-Wpedantic错误的类型参数在强制转换后递增,c,gcc,pointer-arithmetic,gcc-pedantic,C,Gcc,Pointer Arithmetic,Gcc Pedantic,我有一个类似的代码 while (n--) { *((char*)dest++) = *((char*)src++); } 其中,dest和src是空指针和na大小。目标是重新实现memcpy函数。当使用gcc编译这段代码时,一切都很好,但是当我添加-Wpedantic标志时,我有四个警告“错误的类型参数要递增” Google告诉我,当试图在void指针上使用算术时会发生这种情况,因为gcc在这种情况下将void类型视为1字节类型,但传统编译器不应该这样做。然后我必须将指针转换为char指
while (n--)
{
*((char*)dest++) = *((char*)src++);
}
其中,dest
和src
是空指针和n
a大小。目标是重新实现memcpy函数。当使用gcc编译这段代码时,一切都很好,但是当我添加-Wpedantic
标志时,我有四个警告“错误的类型参数要递增”
Google告诉我,当试图在void指针上使用算术时会发生这种情况,因为gcc在这种情况下将void类型视为1字节类型,但传统编译器不应该这样做。然后我必须将指针转换为char指针,但正如您所看到的,我已经这样做了
有什么想法吗?在使用前将(void)dest
和src
转换为无符号字符*
,可以得到最干净的代码(代价是堆栈上的两个指针变量)
(为什么
无符号
?因为这是标准明确定义它的方式;-)*((long*)dest)++)=*(((long*)src)++)代码>我也想到了,但是我有一个错误“作为增量操作数需要左值”,您可以单独执行增量:dest=(long*)dest+1代码>是的,你是对的,事实上我只是复制了代码的一部分,在那里我验证了我必须复制的数据是按单词对齐的,如果不是,我就使用char type。现在我将在文章中修复它,++的优先级高于强制转换,因此增量指向无效指针,而无效指针不是allowed@Thüzhen:根据您的编辑修改答案。对不起,我认为发出警告的原因有点明显…;-)为什么*((长*)dest)++)=*((长*)src)++)代码>不起作用吗?@Thüzhen:因为你在临时做算术?
unsigned char * dest_p = (unsigned char *)dest;
unsigned char * src_p = (unsigned char *)src;
while ( n-- )
{
*dest_p++ = *source_p++;
}