【问题标题】:Keil µvision 5 header file shows an error, however it is compiled without problemsKeil µvision 5 头文件显示错误,但编译时没有问题
【发布时间】:2017-11-13 10:10:44
【问题描述】:

我可以访问这个项目。它是在 Keil µvision 5 中编译的。当我编译项目时,它没有错误。但是,当我访问头文件时,它显示一个错误,说 s8 变量有以下错误 = error: unknown type name 's8'.

    typedef struct
    {
      s8 str[PARAM_TEXT_SIZE];
    }
    text_struct;

变量定义如下:

   typedef char   s8;

不知是我编译器配置错误,还是编译后忽略了这个错误。

PS:这是我在 StackOverflow 网站上的第一个问题。抱歉,如果我的问题不清楚或放置错误。

【问题讨论】:

  • 谁定义了变量,在哪里?这些文件位于哪些文件中? s8 不是标准的。此外,将char 键入为带符号的 8 是一个非常糟糕的主意,因为它可以是无符号的。你应该做的(从 1999 年开始)是使用 stdint.h 而不是一些自制的垃圾类型。
  • @Lundin '(自 1999 年以来)' --> 自您的交叉编译器提供商意识到 21 世纪是一件事的那一年。 在 198X 中哭泣。 (无论如何,ARM 编译器都是最新的)
  • 你好@Lundin,正如我所说,我得到了这个代码。通常,我会使用你所说的'stdint.h'。但是,这是一个大代码(超过 100k 代码行),并且这个变量在代码中被广泛使用。它在 arm 微控制器的“typedef_arm.h”文件中定义。它被定义为有符号变量,因为它对微控制器的二进制计算很重要。
  • 如果这段代码来自一个头文件,那么这个头文件完全有可能没有包含 s8 的 typedef 所需的包含,但是包含有这个错误的文件确实包含它,所以在编译时没有问题,但静态地说头是不完整的。

标签: c compiler-errors header-files


【解决方案1】:

如果s8 定义在一个头文件中,比如foo.h,而你的text_struct 定义在另一个头文件中,则称它为bar.h,那么如果包含bar.h 的文件包含@987654327,它就可以完美编译@ 第一的。然而,它并不干净,通常不依赖此类先决条件包含是一个好习惯。

这是一个非常简单的例子:

foo.h

typedef int myType;

bar.h

typedef struct {
    myType x;
} myStruct;

ma​​in.c

#include <stdio.h>
#include <stdlib.h>
#include <stdint.h>

#include "foo.h"
#include "bar.h"

myStruct y;

int main(void) {
    return 0;
}

这将毫无问题地编译,但是如果bar.h 被静态评估,那么它将产生错误,因为myType 在此处未知。如果包含bar.h 而没有包含foo.h,那么您将遇到编译错误。这是一个例子:

error.c

#include "bar.h"

myStruct z;

gcc -I。错误.c -o 错误.o

在 error.c:1:0 中包含的文件中: bar.h:2:5:错误:未知类型名称“myType” 我的类型 x;

【讨论】:

  • 您好@TimF,感谢您的回答!不过我忘了说,头文件的声明是这样的:#ifndef _PARAM_H#define _PARAM_Hcode#endif这种声明我不是很熟悉,所以不知道是否允许在这里声明一个头文件。
  • 是的,你是。这个PARAM_H 只是防止您多次包含标题的保护措施。将它放在每个标题的顶部是标准的,它应该具有标题的大写名称 + H。在我的示例中,它将是 _FOO_H_BAR_H。见Include Guard on Wikipedia。如果我的回答有用,请不要犹豫并接受它。顺便说一下,欢迎使用 StackOverflow!
  • 感谢@TimF!对我来说工作得很好。感谢您的热烈欢迎 ! :)
猜你喜欢
  • 2018-08-22
  • 2018-06-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-01-23
  • 1970-01-01
相关资源
最近更新 更多