Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/58.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
要求澄清“的有效性和理由”;“空的”;Python CFFI定义文件中的C结构定义_C_Data Structures_Struct_Python Cffi_Cffi - Fatal编程技术网

要求澄清“的有效性和理由”;“空的”;Python CFFI定义文件中的C结构定义

要求澄清“的有效性和理由”;“空的”;Python CFFI定义文件中的C结构定义,c,data-structures,struct,python-cffi,cffi,C,Data Structures,Struct,Python Cffi,Cffi,我正在阅读一些代码,遇到了一个相当奇怪的C结构定义: 有人能解释一下吗(如果可能,请提供参考资料): 如果这是一个有效的结构定义 这种定义的目的是什么(如果没有定义字段/成员) typedef结构数据对象 { ...; }数据对象 [[编辑]] 上面的代码是可用的 如果这是一个有效的结构定义 不,不是。要获取C17 6.7.2.1正式语法的一部分: 结构声明: 说明符限定符列表结构声明符listopt 静态断言声明 因此,首先,结构需要包含一个“说明符限定符列表”,在简单的英语中,它是变量名

我正在阅读一些代码,遇到了一个相当奇怪的C结构定义:

有人能解释一下吗(如果可能,请提供参考资料):

  • 如果这是一个有效的结构定义

  • 这种定义的目的是什么(如果没有定义字段/成员)

    typedef结构数据对象 { ...; }数据对象

  • [[编辑]]

    上面的代码是可用的

  • 如果这是一个有效的结构定义
  • 不,不是。要获取C17 6.7.2.1正式语法的一部分:

    结构声明:
    说明符限定符列表结构声明符listopt

    静态断言声明

    因此,首先,结构需要包含一个“说明符限定符列表”,在简单的英语中,它是变量名之前的
    const int
    etc内容。由于这一点不存在,例如,gcc抱怨语法错误:

    错误:在“…”标记之前应有说明符限定符列表


    2.这种定义的目的是什么(如果没有定义字段/成员)

    我猜要么是伪代码,要么是开发人员的“TODO”,他们在其中提交了未编译的代码,因为它尚未编写

    如果这是一个有效的结构定义

    没有

    这种定义的目的是什么(如果没有定义字段/成员)

    该文件的目的是为python CFFI解析器提供要使用的类型和函数声明

    此文件的目的是由预处理。发件人:

    此外,您可以在cdef()中的不同位置使用“…”(字面意思是dot),以便要求C编译器填写详细信息。这些地方包括:

    • 结构声明:任何以“…”结尾的结构{}或联合{};,因为最后一个“字段”是部分的:它可能是缺少的字段,使它们声明为无序的,使用非标准对齐方式,等等。精确地说,字段偏移量,总结构大小,通过查看cdef推断出的总体结构对齐不受依赖,而是由编译器更正。(但请注意,您只能访问您声明的字段,而不能访问其他字段。)任何不使用“…”的结构声明都被认为是准确的,但这是经过检查的:如果不正确,则会出现错误
    • [……]
    • 未知类型:[……]在某些情况下,您需要说foo_t不是不透明的,只是一个不知道任何字段的结构;然后使用
      typedef struct{…;}foo\t
    我怀疑这对CFFI意味着
    struct dataObject
    DATA\u OBJECT
    是不透明类型,只能用作指针,CFFI解析器不支持结构声明


    据我所知,该文件用于为C构建
    clipspy
    python接口。

    为什么键入
    而不是让它空着?我很确定它应该是伪代码?这不是C源文件;文件扩展名为
    .cdef
    。仅从名称来看,我猜想它是由其他软件处理成C源文件的。你确定上面提到的代码可以编译吗?命名接受它的编译器,is说:
    声明也可以在不同的地方包含“…”;这些占位符将由编译器完成。
    。是时候复习一下谷歌技能了。我认为这解释了语义。这种语法使得
    数据\u对象
    不不透明。对于不透明结构,常规C语法也可以在cffi中使用。区别在于非不透明结构具有已知的大小,可以实例化。有些C API就是这样工作的,你调用一个函数来初始化你的结构(而不是直接写它的字段),但是结构本身必须由你的代码声明,并且你把一个指向它的指针传递给初始化器函数。是的,如果是实际不透明的结构,定义中就没有typedef,它必须(可选)被放置在结构转发声明中。