>> libc.printf("%f %f\n", c_float(-6ren">
gpt4 book ai didi

python - ctypes 奇怪地处理函数中的可变参数

转载 作者:行者123 更新时间:2023-11-28 17:55:49 31 4
gpt4 key购买 nike

我正在启动这个片段:

>>> from ctypes import *
>>> libc = CDLL("libc.so.6")
>>> libc.printf("%f %f\n", c_float(1.0), c_double(1.0))
0.000000 1.000000

printf 期望 %f 有一个 double 但我认为 float 在可变参数函数中被提升为 double ,如下面的 C 代码所示:

#include<stdio.h>
int main()
{
float a = 1.0f;
double b = 1.0;
printf("%f %f\n", a, b);
}

产生预期的 1.000000 1.000000

我错过了什么吗?编译器是否在 C 代码中进行了一些隐式转换?

我使用的是 64 位机器。

最佳答案

调用者负责将类型从float 提升为double。但是 ctypesprintf 的签名一无所知,除非你告诉它。它不知道它是可变的,并且需要进行类型提升。

如果您不通过设置argtypesrestype 来告诉ctypes 函数的签名是什么,它假定一个 int 返回类型,并且您传入的任何参数都与签名匹配。所以在你的情况下,它只是假设 printf 的签名是:

int printf(char*, double, float)

据我所知,没有办法在 ctypes 中定义可变参数 argtypes,但它似乎并没有进行转换,即使 argtypes 已设置:

>>> from ctypes import *
>>> libc = CDLL("libc.so.6")
>>> libc.printf.argtypes = [c_char_p, c_double, c_double]
>>> libc.printf(c_char_p(b"%f %f\n"), c_double(1.0), c_float(1.0))
Traceback (most recent call last):
File "printf.py", line 5, in <module>
libc.printf(c_char_p(b"%f %f\n"), c_double(1.0), c_float(1.0))
ctypes.ArgumentError: argument 3: <class 'TypeError'>: wrong type

关于python - ctypes 奇怪地处理函数中的可变参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58560040/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com