拥有struct
-
typedef struct Point{
....
}
我想在prototype
之前写下main()
,类似于
typedef struct Point ;
int main() {
Point p1 ,p2 ;
...
}
typedef struct Point {
int x;
int y;
} Point;
上面给出了错误 - unknown type name 'Point'
。
我怎么能做到这一点?
修改
我知道如果我在struct
之前定义main()
,那将会有效。我只是想知道它是否与prototye
类似function prototye
。
答案 0 :(得分:3)
此声明:
typedef struct Point;
在C中无效。
我怎么能做到这一点?
typedef struct Point {
int x;
int y;
} Point;
int main() {
Point p1 ,p2 ;
}
struct Point
之后,main
声明无法实现相同的效果,因为当您申报时,实施必须知道Point
对象p1
和p2
的存储空间他们在main
。
答案 1 :(得分:3)
你不能这样做,因为C语言是围绕一次传递编译组织的。在使用类型名称来声明或定义某些内容时,该类型先前已声明过。
放宽了这条规则,即:你可以在C中定义不完整类型。但是,不完整的类型不能用于定义对象:至少不是某些类型的对象。所以这是无效的:
struct foo; /* introduces incomplete type foo */
struct foo x; /* incomplete type for external definition is okay, as long
as the type is completed before the end of the translation unit. */
extern struct foo e; /* incomplete type for external declaration is allowed even if
the type is not completely known in this translation unit
at all. A definition of the object e must exist somewhere
in the linked program---unless e is not used; then a definition
need not exist at all. */
void func(void)
{
struct foo y; /* incomplete type not okay here */
}
struct bar {
struct foo z; /* not okay here */
};
struct foo {
char *s;
}; /* struct foo is now a complete type, but it's too late in the file */
上面的最后一个声明(完成类型struct foo
)允许struct foo x;
定义有效。因此在C类型系统中存在一些“词汇追溯”动作;这不是一般的。
标记为“不正常”的情况要求在源代码中的结点处完成结构类型。
如果要在Point
函数中定义类型为main
的局部变量,则必须在该函数之前声明并完成该类型。如果该类型未完成,您仍可以定义Point *
类型的变量:指向Point
的指针。但是这些指针不能被取消引用。
答案 2 :(得分:3)
您将无法执行此操作,因为编译器在分配时需要知道为Point分配多少空间。原型设计不会给你这个信息。
你可以这样做,因为指针的大小将是已知的:
typedef struct Point Point;
int main() {
Point * p1;
}
struct Point {
int x;
int y;
};
我不知道这是否能满足您的需求,但
答案 3 :(得分:0)
问题是你在main
之后声明了你的结构。
typedef struct Point ; // you dont really need this.
typedef struct Point {
int x;
int y;
} Point;
int main() {
Point p1 ,p2 ;
...
}
更好的是:
typedef struct Point {
int x;
int y;
} Point;
int main() {
Point p1 ,p2 ;
...
}
答案 4 :(得分:0)
将声明放在另一个文件(例如,Point.h
)中,该文件包含在main()
文件的顶部,并将定义放在单独编译的实现中文件(例如Point.cpp
)。