假设我这样声明:
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)
andfoo((uint64_t)x)
equivalent when the function definition is not available to the compiler?
如果只是定义不可用,那么它们就是。如果声明丢失,那就是一个不同的故事......(你不应该这样做! - 它将调用未定义的行为,因为uint32_t
将被假定为参数的类型,但它不是。)
关于c - 函数参数转换何时完成?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17630238/