C语言 IAR 编译失败,CCS 编译工作正常.类型不兼容



在为我的CC2538开发带有CCS的新固件(主固件和库固件)后,所有错误都进行了调试,现在,设备工作正常。

由于从CCS我无法永久刷新固件,我正在与IAR合作开发此操作。

在IAR上,我创建了工作区,项目,并包含了编译固件所需的所有库和文件。但是,由于不兼容的类型错误,编译失败。

  • 错误 [Pe144]:不能使用类型为"int"的值来初始化类型为"签名短 *"的实体

    int16_t *accData[3] = malloc(sizeof(int16_t));
    
  • 错误 [Pe513]:无法将类型为"int"的值分配给实体类型为"签名短*"

    int16_t *accData[3] = malloc(sizeof(int16_t));
    
  • 错误 [Pe120]:返回值类型("有符号短 **")不匹配函数类型("有符号短*")

    int16_t * lsm303d_readAccData(void)
    {
        int16_t *accData[3] = malloc(sizeof(int16_t));
        ...
        return accData;
    }
    

这些错误的根本原因是什么?也许,编译器的任何选项?我需要添加任何文件吗?还是代码原型?

咔!

这些错误的根本原因是什么?

"

类型为"int"的值是根本原因。这里应该没有int!只是signed short*(这是你的int16_t*)和来自malloc的void*

这是因为您使用的是 C90 编译器而忘记#include <stdlib.h> .在找到一个没有原型的函数时,C90 会隐式地假设你想要一个返回 int 的函数,这解释了编译器错误"一个类型为 'int' 的值"。但是 malloc 实际上返回了一个void*,所以这是一个严重的错误。通过在找到malloc的位置包含标头stdlib.h来解决此问题。

这种语言的不受欢迎和非理性的行为在17年前就得到了修复。请考虑改用现代编译器,或将编译器配置为使用当前的 C 语言标准 (ISO 9899:2011)。

话虽如此,这段代码也没有任何意义:

int16_t *accData[3] = malloc(sizeof(int16_t));

你可能的意思是

int16_t *accData = malloc( sizeof(int16_t[3]) );

第一个错误有点误导。 这似乎表明您忘记包含<stdlib.h>,因此malloc未定义,编译器假定它返回int

在任何情况下,您都在分配指向数组的指针:这是不正确的。

返回本地自动数组的地址也是不正确的。

您应该将accData定义为指针而不是数组,并使其指向分配的int16_t数组。 您似乎希望此数组容纳3元素,否则相应地修改代码:

#include <stdlib.h>
int16_t *lsm303d_readAccData(void) {
    int16_t *accData = malloc(sizeof(int16_t) * 3);
    ...
    return accData;
}

应将编译器配置为发出更多警告并拒绝过时的构造,例如隐式 int。 对于gcc,添加-std=c99-std=c11-Wall -Wextra -Werror

最新更新