无法理解C源代码,它不是在GCC中编译的,而是在Visual C中编译的+;

无法理解C源代码,它不是在GCC中编译的,而是在Visual C中编译的+;,c,visual-c++,gcc,C,Visual C++,Gcc,在GCC中,我得到了以下错误: aes.c:在函数“复制块”中: aes.c:278:错误:增量操作数需要左值 aes.c:278:错误:增量操作数需要左值 这是一段代码: static void copy_block( void * d, void *s, uint_8t nn ) { while( nn-- ) *((uint_8t*)d)++ = *((uint_8t*)s)++; } 我试图将其更改为可编译版本,但不幸的是,作为一名Java程序员,我不清楚这里到

在GCC中,我得到了以下错误:

aes.c:在函数“复制块”中:
aes.c:278:错误:增量操作数需要左值
aes.c:278:错误:增量操作数需要左值

这是一段代码:

static void copy_block( void * d, void *s, uint_8t nn )
{
    while( nn-- )
        *((uint_8t*)d)++ = *((uint_8t*)s)++;
}
我试图将其更改为可编译版本,但不幸的是,作为一名Java程序员,我不清楚这里到底发生了什么

也许有人知道我如何更改GCC中可编译的源代码,或者有人知道这里详细发生了什么。对我来说,它似乎是用左手值去引用的,但在Visual C++中似乎是完全有效的。 这是一个小的遗留程序,我必须将其移植到Linux机器上

提前感谢您的帮助。

应该是:

static void copy_block( void * d, void *s, uint_8t nn )
{
    while( nn-- )
        (*((uint_8t*)d))++ = (*((uint_8t*)s))++;
}

你可能把括号的位置搞砸了。 您希望增加指针,而不是取消引用的值

static void copy_block( void * d, void *s, uint_8t nn )
{
    while( nn-- )
        *((uint_8t*)d++) = *((uint_8t*)s++);
}
作为额外提示,使用memcpy。。。快多了

这应该可以做到:

static void copy_block(void *d, void *s, uint_8t nn)
{
    uint_8t *ud = (uint_8t *)d;
    uint_8t *us = (uint_8t *)s;

    while (nn--)
    {
        *ud = *us;
        ++ud;
        ++us;
    }
}
它的可读性也更高。

试试这个:

#include <string.h>
static void copy_block( void * d, void *s, uint_8t nn ) {
  memcpy(d, s, (size_t)nn);
}
uint8_t *da = d, *sa = s;
while(nn--) *da++ = *sa++;
#包括
静态无效复制块(无效*d,无效*s,无效8t nn){
memcpy(d,s,(size_t)nn);
}

那里正在做的事情并不好。

这是一些看起来很毛茸茸的代码。看起来*(指针)++子表达式的优先级规则有问题。(Visual C++接受它是在奇迹和bug之间的某个地方)它似乎只是一个(可怕的)MeMCPY重新实现,所以我建议您使用标准版本:

memcpy(d,s,nn)


我建议在VisualC++中进行快速的特性测试,以确保代码的两个版本实际上做了同样的事情(如它们所示)。您可能依赖于编译器中某些奇怪的边缘情况。

问题是强制转换返回右值,但您正在尝试对强制转换返回的指针执行自动递增。试试这个:

uint8_t *da = d, *sa = s;
while(nn--) *da++ = *sa++;
其他两项说明:

  • nn
    应该比
    uint8\t
    大很多,并且应该是
    size\t
  • 通过这种更改,这个函数被命名为
    memcpy
    ,并且可以在标准库中找到(可能更有效)(我相信是在
    string.h
    中)

与原始代码相同的问题。。。没有工作的希望。我很惊讶visual c++编译了它。。那是C++…这篇文章的标签是“C”,所以我会坚持(size_t)nn为什么不干脆
#定义copy_block memcpy
,让它更有用?@Chris-我想首先写“copy_block”而不是“memcpy”是有原因的-间接记录或其他什么的。全局替换甚至比#define别名更好。@sje397 Hehe:),但显然需要将#include替换为#include:peek@246tNt-ta。回到我的框中:)后缀
++
比一元
*
具有更高的优先级,除非我大错特错。不,后缀
++
具有更高的优先级,这意味着它比
*
绑定得更紧,这意味着不需要插入任何内容。代码仍然不起作用,因为您在右值上使用了增量运算符,这就是错误所说的。这是一个关于语言基本特性的争论。也许写代码的方式不容易让人误读是个好主意。K&R和70年代的任何编程人员一样,写代码也是为了节省源代码文件占用的硬盘空间。除非Terrabyte HD上还有几个字节的源代码是您主要关心的问题,否则不要编写模糊代码。使用下面detunized发布的版本,它在性能方面应该完全相同。@246tNt:您缺少了
-pedantic
标志:您的代码使用了非标准的编译器扩展…我想您需要
uint8\u t
…强制转换在这段代码中是不必要的和非惯用的!在原始帖子中写完全模糊的代码应该是犯罪行为@克里斯托夫-一点也不。现在它看起来不像是我在iPhone上写的P