类型的不完整定义(struct)

时间:2017-05-16 12:24:13

标签: c visual-studio-2015 struct

我多次尝试修复错误" Incomplete Definition of Type of struct *,请您帮助我找出问题并修复它?

对此有何建议?

#include<stdio.h>
#include<stdlib.h>
#include<time.h>
#include<string.h>
struct mypoint;
typedef struct mypoint {
    int x;
    int y;
};

void setRandomPoint(struct mypoint *a, int min, int max)
{
    do {
        a->x = rand();

    } while (a->x > max || a->x < min);
    do
    {
        a->y = rand();
    } while (a->y > max || a->y < min);


}
int main()
{
    struct myPoint point;
    int min = 0, max = 0;
    int i;
    srand(time(NULL));
    while (min >= max)
    {
        printf("Enter min:");
        scanf("%d", &min);
        printf("Enter max:");
        scanf("%d", &max);
    }
    for (i = 0; i<5; i++)
    {
        setRandomPoint(&point, min, max);
        printf("%d. point.x=%d, point.y=%d\n", i + 1, point.x, point.y);
    }
    printf("Finish.\n");
    return 0;
}
请任何人都可以帮助我PLZ?

3 个答案:

答案 0 :(得分:3)

typedef&#39; ed结构添加名称:

typedef struct mypoint {
    int x;
    int y;
} myPoint;

从你的陈述来看:

struct myPoint point;

我想你要给的名字是myPoint。现在,您忘记给它命名,因此myPoint不存在。

还请注意 声明:

struct myPoint point;
即使您为typedef&#39; ed结构命名,您现在使用的

也是错误的。提供姓名后,您可以使用以下方式访问struct

myPoint point;

或:

struct mypoint point;

答案 1 :(得分:1)

struct mypoint;

这是一份前瞻性声明。您告诉编译器存在一个名为mypoint的结构,但是现在编译器无法知道该结构包含什么。这是不完整类型的结构,这意味着稍后您必须使用完整定义来完成它。

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

这不是定义结构的正确方法。如果省略typedef,那么你将得到一个用“{tag”mypoint定义的结构。这就足以使用所述结构,即使你必须在任何地方都将它称为struct mypoint

在制作新的类型时,您应该只使用typedef。这种类型需要一个类型名称,最后输入。上面的代码片段缺少类型名称,这就是编译器错误的原因。

正确的代码:

typedef struct mypoint { // struct "tag"
    int x;
    int y;
} mypoint; // type name

请注意,struct标记和类型名称存在于不同的名称空间中,因此它们实际上可以具有相同的名称。大多数情况下,这两种情况并非同时使用。常见的样式是使用typedef struct {...} mypoint;struct mypoint {...};

对于什么是首选,有一种风格的战争。 Linux阵营更喜欢后一种风格,因此在代码中的任何地方都输出struct。虽然其他人都喜欢使用typedef。支持或反对任何一种风格的论据都是主观的,没有明显的正确与错误。

答案 2 :(得分:0)

typedefed struct中,您忘记了名称myPoint

typedef struct mypoint {
    ...
    ...
} myPoint;

此外,稍后仅使用myPoint point;作为结构已定义myPoint。因此无需再次使用struct

此外,您可以删除语句struct mypoint;