避免对cython中的链表进行嵌套结构重定义

时间:2019-07-04 14:27:03

标签: python c linked-list cython

我想将与链表结构有关的代码移到单独的文件中。 .pyx和.c文件都使用此链接列表。

当前实现: cython_file.pyx:

ctypedef struct linked_list

ctypedef struct linked_list:
    double price
    double volume
    int data
    linked_list *next_cell
...

c_file.c:

typedef struct linked_list {
    double price;
    double volume;
    int data;
    struct linked_list * next_cell;
} linked_list;
...

我想要创建LinkedList.hLinkedList.cLinkedList.pxd,其中将包含以下内容:

LinkedList.h:

typedef struct linked_list {
    double price;
    double volume;
    int data;
    struct linked_list * next_cell;
} linked_list;
...

LinkedList.c:

#include "LinkedList.h"
...

LinkedList.pxd:

cdef extern from "LinkedList.h":
    ctypedef struct linked_list

    ctypedef struct linked_list:
        double price
        double volume
        int data
        linked_list * next_cell

我想按以下方式使用它: 在cython_file.pyx中:

from LinkedList cimport *
...

并在c_file.c中:

#include "LinkedList.h"
...

当我尝试编译第二个变量时,出现错误: LinkedList.h(1): error C2011: 'linked_list': 'struct' type redefinition

我想这个问题是由于嵌套结构引起的

1 个答案:

答案 0 :(得分:1)

要避免使用redefinition errors,必须在头文件中使用包含保护。

//LinkedList.h
#ifndef LINKEDLIST_H
#define LINKEDLIST_H
...
#endif

包含防护是预处理器宏,可防止头文件的多个包含。

它基本上检查是否定义了LINKEDLIST_H。如果是这样,它将跳过if子句中的所有内容。否则它将定义它。

这样一来,您可以避免多次从标头中重新定义结构,这可能是导致此错误的原因。