Определение самоссылочных структур в заголовочном файле C (.h)? - PullRequest
8 голосов
/ 18 декабря 2011

Я пытаюсь создать структуру, используемую в двух исходных файлах .c, чтобы создать простую структуру связанного списка. Я думал, что это сэкономит время на создание структуры в заголовочном файле, однако я получаю сообщение об ошибке «parse error before *».

Это код, который я использую:

/*
 * Structures.h
 *
 *  Created on: Dec 17, 2011
 *      Author: timgreene
 */

#ifndef STRUCTURES_H_
#define STRUCTURES_H_

typedef struct list_struct {
    int data;
    struct list_struct* next;
    struct list_struct* prev;
} list;

#endif /* STRUCTURES_H_ */

Edit: я изначально опускал детали, которые я на самом деле компилирую с xcc из цепочки инструментов XMOS. Я до сих пор не понимаю, что будет разница в .h синтаксисе файла.

Может быть, это флаг компиляции, который я использую?

Вот распечатка консоли:

xcc -O0 -g -Wall -c -MMD -MP -MF"filter.d" -MT"filter.d filter.o " -target=XC-1A -o filter.o "../filter.xc"
In file included from ../filter.xc:15:
Structures.h:13: error: parse error before '*' token
Structures.h:14: error: parse error before '*' token
Structures.h:15: error: parse error before '}' token

Ответы [ 2 ]

10 голосов
/ 18 декабря 2011

Оглядываясь на некоторые документы XMOS, кажется, что проблема в том, что XC - это не C , это просто язык, похожий на C.Из «Руководства по программированию XC»:

XC предоставляет многие из тех же возможностей, что и C, основным упущением является поддержка указателей.

..., что объясняет, почемуон не принимает указатели next и prev в вашей структуре.

Очевидно, что xcc позволяет вам смешивать источники C и XC, поэтому, если вы ограничите использование структуры кодом Cон должен работать.Из «Руководства по командной строке XCC» видно, что все, что имеет расширение .xc (как в командной строке, которую вы использовали выше), по умолчанию рассматривается как исходный код XC, а не C.Это можно изменить, поместив параметр -xc перед источниками C в командной строке и -x после (или просто переименовать файлы с расширением .c).

Если вы должны использовать XC, а не C, вам может понадобиться найти другой способ выполнения действий (возможно, массивы?).

1 голос
/ 18 декабря 2011

Попробуйте использовать предварительное объявление struct list_struct:

struct list_struct;
typedef struct list_struct {
    int data;
    struct list_struct* next;
    struct list_struct* prev;
} list;

Возможно, ваш компилятор не распознает идентификатор в середине своего собственного определения, я не уверен, что об этом говорят стандарты(если что).

Для тех, кто еще не знает, это также способ справиться с круговыми зависимостями в определениях struct:

struct a;
struct b;

struct a {
    int x;
    struct b *y;
};

struct b {
    int x;
    struct a *y;
};
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...