【问题标题】:Incomplete Definition of Type (struct )类型定义不完整(struct)
【发布时间】:2017-05-16 12:24:13
【问题描述】:

我多次尝试修复错误“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;
}

请任何人都可以帮助我吗?

【问题讨论】:

  • 您没有在代码周围添加具体的语句,只是句子,所以 SO 会让您发布。您应该发布错误、在哪一行以及您尝试修复它的原因。
  • struct myPoint point -> struct mypoint point.
  • 如果您的问题得到解决,请考虑接受答案。

标签: c visual-studio-2015 struct


【解决方案1】:

为您的 typedef'ed 结构添加名称:

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

从你的陈述来看:

struct myPoint point;

我猜你想给的名字是myPoint。现在,您忘记给它命名,所以myPoint 不存在。


还要注意声明:

struct myPoint point;

您现在使用的是错误的,即使您为 typedef'ed 结构命名。提供名称后,您可以使用以下方式访问您的struct

myPoint point;

或:

struct mypoint point;

【讨论】:

  • 无论如何都是struct mypoint point; 或者只是myPoint point;
【解决方案2】:
struct mypoint;

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


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

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

您应该只在创建新结构时使用typedeftype。这样的类型需要一个类型名称,该类型名称在末尾键入。上面的代码 sn -p 缺少类型名称,这就是你得到编译器错误的原因。

正确代码:

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

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

关于首选的内容存在一些风格之争。 Linux 阵营更喜欢后一种风格,因此在代码的任何地方都输入struct。虽然几乎所有其他人都喜欢使用 typedef。支持或反对任何一种风格的论点都是主观的,没有明显的对错。

【讨论】:

    【解决方案3】:

    typedefed struct 中你忘记了myPoint 的名字

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

    另外,稍后仅使用 myPoint point;,因为您已经将 myPoint 定义为结构。所以不需要再次使用struct

    另外,你可以去掉struct mypoint;的声明

    【讨论】:

      猜你喜欢
      • 2011-11-28
      • 1970-01-01
      • 2019-08-27
      • 1970-01-01
      • 2017-08-16
      • 2021-05-16
      • 1970-01-01
      • 2012-02-16
      • 2021-03-19
      相关资源
      最近更新 更多