Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/60.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
-Wpedantic错误的类型参数在强制转换后递增_C_Gcc_Pointer Arithmetic_Gcc Pedantic - Fatal编程技术网

-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++;
}