【发布时间】:2012-11-07 22:07:43
【问题描述】:
我一直在纠结这个问题。我在 extern.h 中声明了一个结构:
typedef struct {
char data[Q_SIZE];
int head;
int tail;
int size;
}queue;
在 main.c 我声明了这个结构的两个实例:
queue rxq, txq;
在其他 .c 文件中,如果使用这些结构,则它们被声明为全局外部,即:
extern queue rxq, txq;
在 queue.c 中有几个函数接受指向这些结构之一的指针作为参数:
int QGetSize(queue * q)
{
return q->size;
}
我的编译器要求我对这些函数进行原型制作,但我不喜欢我为它们制作原型的方式:
int QGetSize(queue *);
ERROR: parse error at near '*'
int QGetSize(queue);
ERROR: invalid functions argument declaration
int QGetSize(struct *); // this is the one that to me, should work. the other errors make sense.
ERROR: parse error at near '*'
int QGetSize(struct);
ERROR: parse error at near ')'
int QGetSize(struct queue *);
WARNING: struct declared inside parameter list
可能需要注意的是,在prototype.h文件中,它们不是队列的typedef作为这个结构,如果我尝试对它进行typedef或重新定义它甚至包含最初声明它的.h文件,我得到更多错误。
【问题讨论】:
-
对于声明,typedef 需要在范围内。 (所以
#include "queue.h"或任何标题。) -
如果我 #include "extern.h"(这是定义 struct 的地方)我在 extern.h 中得到一个错误:“无效的重新定义类型名称(队列)”
-
前面的定义在哪里,又是什么?
-
哦,因为 extern.h 和 proto.h 一样包含在每个文件中,所以 proto.h 重新包含了 extern.h,重新声明了这个结构...
-
你在使用标题保护吗?
标签: c struct function-prototypes