繁体   English   中英

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

[英]Passing uint8_t instead of uint32_t into a function (in C)

查看一些代码(用 C 语言编写)我偶然发现了以下内容:

//we have a parameter

uint8_t num_8 = 4;

//we have a function

void doSomething(uint32_t num_32) {....}

//we call the function and passing the parameter

doSomething(num_8);

我无法理解这是否是正确的函数调用。 这是一个演员还是只是一个错误?

一般来说,我知道在 C/C++ 语言中只有变量的副本被传递到函数中,但是,我不确定实际发生了什么。 编译器是否在堆栈上分配 32 位(用于传递的参数),将所有位归零并在复制参数之后立即分配?

谁能给我指出解释参数传递背后机制的资源?

由于函数声明包含参数类型列表,因此编译器知道预期参数的类型。 然后它可以隐式地将实际参数转换为预期的类型。 事实上,编译器处理函数调用就像是:

doSomething((uint32_t) num_8);

曾经使用过(不太)好的 K&R C 的老程序员应该记得,pre-ansi C 只有标识符列表,并且没有明确声明参数的类型。 在那些日子里,我们必须显式地转换参数,当我们忘记时,我们没有编译时警告,而是在执行时出错。

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

暂无
暂无

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

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