【问题标题】:Compile error i can't figure out编译错误我想不通
【发布时间】:2011-08-14 04:13:22
【问题描述】:

当我尝试使用某个结构时,我得到“‘数据’的存储大小未知”。

代码:

ioHelper.h:

    #ifndef IOHELPER_H_
    #define IOHELPER_H_

    typedef struct fileValues data;

    struct fileValues ioInput(FILE* file,int dim,int sign);

    #endif /* IOHELPER_H_ */

ioHelper.c:

    struct fileValues
    {
int dim;
char sign;
double x;
double y;
    };

map.c:

    void drawData(FILE* vectors)
    {

double paramLoc [MAX_DIMENSION];
char sign;
(this is where i get the error) struct fileValues data;
    ...
    }

有什么想法吗?

【问题讨论】:

    标签: c++ c compiler-errors


    【解决方案1】:

    这是因为在编译 map.c 时,编译器看不到 IoHelper.c 中结构的完整定义。

    您可能只包含了 IoHelper.h,它有(不完整的)声明,而不是定义。

    所以你不能在 map.c 中声明该结构类型的变量,除非你

    • 包括 IoHelper.c(坏主意)
    • 将结构体定义放在IoHelper.h中
    • 在 map.c 中声明一个指向该结构的指针并对其进行 malloc。

    【讨论】:

    • 如果您在 map.c 中对其进行 malloc,您将不知道要分配多少内存(除非您以其他方式获得该信息)。如果需要,在 IoHelper.h 中声明分配函数会更有意义。
    【解决方案2】:

    假设 map.c 不包括 IoHelper.c,它只看到 typedef 而看不到 struct fileValues 的声明。因为它没有看到声明,所以它无法弄清楚结构有多大,因此编译错误。

    通常你会在头文件中声明一个结构 - 将它从 iohelper.c 移动到 iohelper.h 并且 map.c 现在应该可以编译了。

    【讨论】:

      【解决方案3】:

      data 是一个不完整类型。这意味着它没有完全定义,所以它的大小是未知的。在这种情况下,它根本没有定义,只是声明了。

      您需要为声明此类型变量的代码提供一个定义,例如在您的函数drawData 中。

      您可以对不完整类型执行的操作包括将其用作指针或引用类型的基础,并将其用作函数声明中的结果或按值参数类型(就像您所做的那样)。但你不能做任何需要知道大小的事情。声明变量需要知道大小。

      干杯&hth.,

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2017-08-15
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多