main()之前的结构原型

时间:2013-12-03 23:27:33

标签: c struct prototype

拥有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

5 个答案:

答案 0 :(得分:3)

此声明:

typedef struct Point;

在C中无效。

  

我怎么能做到这一点?

typedef struct Point {
   int x;
   int y;
} Point;

int main() {
    Point p1 ,p2 ; 
}

struct Point之后,main声明无法实现相同的效果,因为当您申报时,实施必须知道Point对象p1p2的存储空间他们在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)。