繁体   English   中英

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

[英]Cannot understand C source and it does not compile in GCC, but in Visual C++

在GCC中我收到以下错误:

aes.c:在函数'copy_block'中:
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机器上。

提前谢谢你的帮助。

尝试这个:

#include <string.h>
static void copy_block( void * d, void *s, uint_8t nn ) {
  memcpy(d, s, (size_t)nn);
}

在那里做的是不好的。

这应该这样做:

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

它也更具可读性。

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

memcpy(d, s, nn);

我建议在Visual C ++中进行快速表征测试,以确保代码的两个版本实际上做同样的事情(就像它们看起来那样)。 您可能在编译器中依赖于一些古怪的边缘情况。

问题是转换返回rvalues,但是你试图对一个强制转换返回的指针进行自动增量。 尝试这个:

uint8_t *da = d, *sa = s;
while(nn--) *da++ = *sa++;

另外两个说明:

  • nn应该比uint8_t大得多,应该是size_t
  • 通过该更改,此函数名为memcpy并且在标准库中找到(可能更有效)(我相信在string.h )。

为什么每个人都认为必须尽可能始终使用库函数?

在高完整性系统上,您希望避免像plauge这样的库函数,因为只要包含库头,就必须验证其中的所有源代码,确保它没有bug。 验证整个string.h并通过静态analyzis工具等运行它并不是一项有趣的任务。

对于所有非PC程序员,这里是您可以使用的MISRA-C:2004兼容版本。

void gpfunc_memcpy (void* s1, const void* s2, uint16 n)
{
        uint8* u_s1 =       (uint8*) s1;
  const uint8* u_s2 = (const uint8*) s2;

  while(n != 0)
  {
    *u_s1 = *u_s2;

    ++u_s1;
    ++u_s2;  
    --n;
  }
}

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

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 )
{
    while( nn-- )
        (*((uint_8t*)d))++ = (*((uint_8t*)s))++;
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM