首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >返回类型为uint8_t的函数返回4个字节

返回类型为uint8_t的函数返回4个字节
EN

Stack Overflow用户
提问于 2013-06-06 02:41:27
回答 1查看 2.6K关注 0票数 3

编辑:问题的解决方案是一个丢失的原型。

当我调用uint8_t foo(uint16_t bar)并将它的返回值赋给一个uint32_t temp时,不仅temp的LSB会被覆盖,甚至更多。这怎么可能呢?编译人员是GCC。

调用代码:

代码语言:javascript
复制
uint32_t temp = 0xAAAAAAAA;
printf("[%x]\n", temp);
temp = foo(me->bar);
printf("[%x]\n", temp);

输出:

代码语言:javascript
复制
[aaaaaaaa]
[4081ff]

这里介绍了foo实现的相关部分。

代码语言:javascript
复制
typedef struct CMOCK_foo_CALL_INSTANCE_tag
{
  UNITY_LINE_TYPE LineNumber;
  uint8_t ReturnVal;
  int CallOrder;
  uint16_t Expected_nGoNo;
} CMOCK_foo_CALL_INSTANCE;

uint8_t foo(uint16_t bar)
{
  CMOCK_foo_CALL_INSTANCE* cmock_call_instance =
    (CMOCK_foo_CALL_INSTANCE*)CMock_Guts_GetAddressFor(Mock.foo_CallInstance);
  (...)
  return cmock_call_instance->ReturnVal;
}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-06-06 03:21:39

确保调用temp = foo(me -> bar);的文件在调用之前包含uint8_t foo(uint16_t bar);函数的原型或完整定义,可以通过#include指令,也可以通过在文件的前面添加原型/定义。

如果函数没有已经看到的签名,编译器将假定签名为int foo();,并相应地生成代码。

使用gcc -W -Wall进行编译应该会在进行隐式函数签名假设时生成警告。

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/16947467

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档