未知类型名称'uint8_t',MinGW


74

我在MinGW中使用C得到“未知类型名称'uint8_t'”和其他类似的名称。任何想法如何解决这个问题?


9
你包括了stdint.h吗?
Necrolis 2012年

Answers:



18

要使用uint8_t类型别名,您必须包括stdint.h标准标题。


7

编辑:

要清楚:如果您#include的顺序很重要,并且不是设计模式的一部分(请阅读:您不知道为什么),那么您需要重新考虑设计。最有可能的是,这仅意味着您需要将#include头文件添加到导致问题的头文件中。

在这一点上,我对讨论/捍卫该示例的优点不感兴趣,但由于它说明了编译过程中的一些细微差别以及它们为什么导致错误的原因,因此将其保留下来。

结束编辑

你需要#includestdint.h在你#include需要它的任何其他库接口。

例:

我的LCD库使用uint8_t类型。我用接口(Display.h)和实现(Display.c)编写了我的库

在display.c中,我具有以下内容。

这可行。

但是,如果我这样重新排列它们:

我得到您描述的错误。这是因为Display.h需要信息,stdint.h但无法访问它,因为该信息是在Display.h编译后编译的。

因此,将其移到stdint.h需要它的任何库之上,您就不会再收到该错误。


19
那只是糟糕的设计,Display.h应该包含一个#include <stdint.h>。不要依赖包含文件来为您包含事物。这就是标头后卫的用途。
耶尔斯卡2014年

有点不完整。您是否可以扩展或提供有关为什么不应在源文件中包含的参考?我的include不提供库提供的功能所需的类型,因此我认为它们不必位于头文件中。
LanchPad 2014年

一旦使用了任何文件中任何标头中的任何内容,您就将其包含在源文件中。我没有说您应该在标头中包含所有文件(我确实做了,但是在您回答之前就进行了编辑)。在我的评论中,我仅指出为了使其正常工作而必须在另一个文件之前包含一个文件的设计多么糟糕。它不会为您节省任何空间,因为您每次都需要在文件之前添加此内容。如果Display.h需要stdint.h,不将include直接放入其中是不正常的。
耶尔斯卡2014年

“我的包含项未提供库提供的功能所需的类型”:您的回答和所描述的错误恰恰相反。
耶尔斯卡2014年

3
对不起,我不清楚。“ Display.h”没有提供功能,需要“ stdint.h”。这些函数还可以接受在“ Display.h”本身中定义的类型。因为实现“ display.h”的程序也不必实现“ stdint.h”,所以我认为在没有程序员明确键入“ #include <stdint”的情况下公开“ stdint.h”库也不是一件好事。 .h>'这样做。
LanchPad 2014年

0

我必须包括“ PROJECT_NAME / osdep.h”,其中包括操作系统的特定配置。

我会使用您感兴趣的类型查看其他文件,并找到它们的定义位置/方式(通过查看包含)。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.