Избегайте переопределения вложенных структур для связанных списков в Cython - PullRequest
0 голосов
/ 04 июля 2019

Я хочу переместить код, связанный со структурой связанного списка, в отдельный файл.Этот связанный список используется в файлах .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.h, LinkedList.c и LinkedList.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 Ответ

1 голос
/ 04 июля 2019

Чтобы избежать redefinition errors, вы должны использовать в своих заголовочных файлах защиту для включения.

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

Включающие охранники - это макросы препроцессора, которые предотвращают многократное включение заголовочных файлов.

Это в основномпроверяет, определено ли LINKEDLIST_HЕсли это так, он пропускает все в предложении if.В противном случае он определяет его.

При этом вы избегаете многократного переопределения своих структур из заголовков, что может быть причиной этой ошибки.

...