【问题标题】:Variable was declare with a never-completed type变量被声明为从未完成的类型
【发布时间】:2017-05-14 12:27:46
【问题描述】:

我有三个文件

  • main.c
  • myStruct.h
  • myStruct.c

我读了一些关于在哪里定义结构和封装的帖子,我想在头文件中声明我的结构并在源文件中定义它。

这是我测试过的。

myStruct.h

// myStruct.h
#include "stdint.h"

typedef struct myStruct myStruct_type;

myStruct.c

// myStruct.c
#include "myStruct.h"

struct myStruct {
    uint32_t itemA;
    uint32_t itemB;
    uint32_t *pointerA;
    uint32_t *pointerB;
};

main.c

// main.c
#include "myStruct.h"

myStruct_type testStruct;    // This is where I get the error message

int main (void) {
    while (1);

    return 0;
}

当我尝试编译 (Keil uVision) 时,我收到以下错误“变量 'testStruct' 被声明为从未完成的类型 myStruct_type testStruct”

我错过了什么?

【问题讨论】:

  • 结构定义需要在每个需要的地方都可见。将其从 c 文件移动到 h 文件。
  • struct myStruct 移动到头文件中。否则它对 main.c 不可见
  • 或者将myStruct_type * new_myStruct_type(void){ return malloc(sizeof (myStruct_type)); } 之类的内容放入myStruct.c 并在main() 中定义myStruct_type * pmyStruct = new_myStruct_type();
  • 另外你应该使用尖括号作为标准包含,以防本地搜索路径上碰巧有同名文件

标签: c arm keil


【解决方案1】:

你不能这样声明 testStruct,myStruct_type 是一个不完整的类型。你最多可以声明一个指针。

所以改变

myStruct_type testStruct;

myStruct_type *testStruct;

你可以这样想,当编译器在编译main.c时,它没有myStruct_type中的成员信息,所以它不能计算结构的大小。

【讨论】:

  • 这确实意味着您不能直接访问成员,您必须为此创建函数。当您想要公开必须用于在库外部保持状态的内容而不公开内部结构时,这是一种常见的做法。这主要适用于例如您在内部使用私有标头但仅在公共标头中定义虚拟类型的库。这样您就可以构建一个稳定的 API,因为您可以在版本之间安全地添加/删除成员,而不会影响 API。如果你不是在写一个库,你不应该打扰。
猜你喜欢
  • 1970-01-01
  • 2019-01-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-06-26
相关资源
最近更新 更多