【问题标题】:How can I get the `const` modifier of a CFFI function in Python?如何在 Python 中获取 CFFI 函数的 `const` 修饰符?
【发布时间】:2018-12-12 04:43:32
【问题描述】:

我正在为生成的 C 代码编写 Python 包装器,其中包含使用指针参数作为输出的函数。我想反省那些使用 CFFI 生成的函数,以确定它们是否是我们的输出参数的输入。输入参数标记为const,但似乎 CFFI 丢弃了此信息。

考虑以下示例

from cffi import FFI
ffibuilder = FFI()

ffibuilder.set_source("_example",
   r"""
        int add(const int a, const int b) {
            return a+b;
        }
    """)

ffibuilder.cdef("""
        int add(const int a, const int b);
""")

if __name__ == "__main__":
    ffibuilder.compile(verbose=True)
    import _example
    ff = _example.lib.add
    ff_t = _example.ffi.typeof(ff)
    print(ff_t)

打印<ctype 'int(*)(int, int)'>,而输入在代码中定义const

【问题讨论】:

    标签: python python-cffi


    【解决方案1】:

    对不起,不可能。在将解析后的代码转换为 CFFI 的内部 ctype 时,此信息已被丢弃。

    查看pycparser 模块(CFFI 内部使用的那个);它将 C 源代码转换为解析树。从那里您可以更直接地再次获取所有这些信息。

    【讨论】:

    • 这是错误还是功能?
    • 这不是 CFFI 的目标。
    • 为什么 CFFI 的类型表示不完整?这不会引起问题吗?还是 CFFI 只关心类型的大小和含义,而不关心它的语义?我记得文档的某些部分提到没有什么可以阻止您尝试写入静态 char 数组,我想有一个正确的类型表示可以解决这个问题。
    • CFFI 的方法不是使用类型来解决任何特定问题(就像它也不是 Python 背后的哲学一样)。 CFFI 只使用类型,因为没有它们就不能在 C 中调用外部函数。现在,在您的情况下,如果您调用的 C 库公开了可以从中派生一些更高级别信息的类型,那么是的,您当然可以在此基础上进行构建。在您的情况下,它是const;在其他情况下,它是预先格式化的 cmets,在之前或之后编写;等等。没有一个适合 CFFI 的答案。在您的情况下,您只需要pycparser
    猜你喜欢
    • 2013-09-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-12-10
    • 2013-01-27
    • 2013-06-03
    • 2018-07-07
    • 2021-05-07
    相关资源
    最近更新 更多