c - 函数参数转换何时完成?

标签 c arguments type-conversion

假设我这样声明:

void foo(uint64_t);

并且该函数是在外部汇编文件中定义的。现在我在 C 代码中这样调用它:

uint32_t x = 42;
foo(x);

什么时候x转换为uint64_t?我是否可以依赖我的汇编代码始终在相关目标的 ABI 强制要求的任何寄存器/堆栈位置中接收 uint64_t,还是我必须自己进行转换?

换句话说,当编译器无法使用函数定义时,foo(x)foo((uint64_t)x) 是否等效?这可能是一个愚蠢的问题,但我不确定这里到底发生了什么。

最佳答案

显然,它从不强制转换uint64_t,我没有看到任何类型转换发生在其中代码。相反,它被提升uint64_t,是的,它总是自动发生(根据标准的措辞,根据“通常的算术转换”)。因此,您无需手动转换。

In other words, are foo(x) and foo((uint64_t)x) equivalent when the function definition is not available to the compiler?

如果只是定义不可用,那么它们就是。如果声明丢失,那就是一个不同的故事......(你不应该这样做! - 它将调用未定义的行为,因为uint32_t将被假定为参数的类型,但它不是。)

关于c - 函数参数转换何时完成?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17630238/

相关文章:

C编程: Segmentation Fault (Core Dumped)

c - 我的代码有什么问题(CS50 2012 Pset 1 贪婪)

java - 当结构不同时如何将JSON字符串转换为JAVA对象

c - 写入内存? (PIC内部EEPROM)

c - Flex & Bison : "true" being interpreted as and ID

graph - 在 Espresso 测试期间提供导航参数

c - 将参数从 bash 传递到 C

c++ - main 函数可以有默认参数值吗?

sql-server - Case when语句中的SQL转换错误

c# - 在 C# 中将 System.Web.UI.WebControls.Unit 转换为 int