将uint8_t而不是uint32_t传递给函数(在C中)

时间:2019-04-16 15:21:22

标签: c casting

翻阅一些用C语言编写的代码,我偶然发现以下内容:

[Date].[Year].&[2019]

我很难理解这是否是正确的函数调用。这是铸造还是错误?

通常,我知道在C / C ++语言中,仅将变量的副本传递到函数中,但是,我不确定实际发生了什么。编译器是否在堆栈上分配32位(用于传递的参数),将所有位清零,然后在复制参数之后?

有人可以指出我的资源来解释参数传递的机制吗?

1 个答案:

答案 0 :(得分:1)

由于函数声明包含参数类型列表,因此编译器知道所需参数的类型。然后,它可以将实际参数隐式转换为期望的类型。实际上,编译器将函数调用视为:

doSomething((uint32_t) num_8);

曾经使用(不是这样)好的K&R C的老程序员可以记住,ansi C之前只有标识符列表,并且没有明确声明参数的类型。那天,我们不得不明确地强制转换参数,而当我们忘记了这些参数时,我们没有编译时警告,但是在执行时出错。

使用汇编语言或机器指令精确转换转换和调用的方式只是实现细节。重要的是,一切都必须发生,就好像编译器已声明一个临时uint32_t变量将uint8_t值强制转换为该临时变量并将该临时变量传递给该函数一样。但是优化编译器通常使用寄存器来传递单个整数参数。根据处理器的不同,它可以将累加器清零,将低字节中的单个字节加载并调用函数。