在C语言的头文件(.h)中定义自引用结构体?

8
我将尝试创建一个结构体,用于在两个.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_ */

编辑:我原本忽略了一个细节,即我实际上是使用来自XMOS工具链的xcc进行编译。我仍然不明白在.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

5
对我来说,您的代码可以成功编译。(使用GCC 4.5) - Owen
13
请注意,以下划线 "_" 开头的标识符是保留的,不应使用。 - Oliver Charlesworth
2
你的代码是正确的,错误在其他地方。 - Kerrek SB
3
@Pubby,Owen:请查看C99 7.1.3的第二个要点。 - Oliver Charlesworth
3
请显示具体的错误信息。 - Karl Knechtel
显示剩余8条评论
2个回答

10

从 XMOS 文档中了解到,看起来问题在于 XC 并不是 C,它只是一种类似 C 的语言。来自 "XC Programming Guide" 的描述:

XC 提供了许多与 C 相同的功能,主要缺失的是对指针的支持。

...... 这就解释了为什么它不能接受你结构体中的 nextprev 指针。

显然,xcc 允许您混合使用 C 和 XC 源代码,因此,如果您将结构体的使用限制在 C 代码中,那么它应该可以工作。根据 "XCC Command-Line Manual",任何带有 .xc 扩展名(如上面使用的命令行)默认情况下会被视为 XC 而不是 C 源代码。这可以通过在命令行中在 C 源代码之前放置选项 -xc 并在之后放置选项 -x (或者只需将文件重命名为 .c 扩展名)来覆盖。

如果您必须使用 XC 而不是 C,则可能需要找到另一种方法来完成任务(例如使用数组等方式)。


哦哇!这是我犯下的一个令人尴尬的疏忽,谢谢你,德米特里!在过去的几个小时中,我感到非常的羞愧... - Tim Greene
此外,对于其他遇到同样问题的人来说,使用头文件在XC中包含普通的C代码非常简单,因此如果可能的话,请将数据结构要求外包到.xc文件之外,绝对不要在任何被.xc模块使用的头文件中定义指针,否则你会看起来很傻。 - Tim Greene

1
尝试使用结构体list_struct的前向声明:
struct list_struct;
typedef struct list_struct {
    int data;
    struct list_struct* next;
    struct list_struct* prev;
} list;

也许你的编译器无法识别其定义中间的标识符,我不确定标准对此是否有规定(如果有的话)。
对于那些还不知道的人来说,这也是处理结构体定义中的循环依赖的方法:
struct a;
struct b;

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

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

2
OP的代码完全符合标准。如果编译器不支持它,那么就需要抛弃这个编译器。 - Oliver Charlesworth
-1 如果您的循环依赖示例属于合法的 C 代码,则会创建无限大的类型。sizeof(struct a) 会返回什么? - Chris Lutz

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接