C 基尔µ;vision 5头文件显示错误,但编译时没有问题

C 基尔µ;vision 5头文件显示错误,但编译时没有问题,c,compiler-errors,header-files,C,Compiler Errors,Header Files,我有权进入这个项目。它是在Keilµvision 5中编译的。当我编译项目时,它没有错误。但是,当我访问头文件时,它会显示一个错误,即s8变量有以下错误=错误:未知类型名称“s8” typedef struct { s8 str[PARAM_TEXT_SIZE]; } text_struct; 变量定义如下: typedef char s8; 我想知道我是否错误地配置了编译器,或者为什么在编译之后忽略了这个错误 这是我在StackOver

我有权进入这个项目。它是在Keilµvision 5中编译的。当我编译项目时,它没有错误。但是,当我访问头文件时,它会显示一个错误,即s8变量有以下错误=错误:未知类型名称“s8”

    typedef struct
    {
      s8 str[PARAM_TEXT_SIZE];
    }
    text_struct;
变量定义如下:

   typedef char   s8;
我想知道我是否错误地配置了编译器,或者为什么在编译之后忽略了这个错误


这是我在StackOverflow网站上的第一个问题。对不起,如果我的问题不清楚或放错了位置。

如果
s8
是在一个标题中定义的,比如说
foo.h
,而您的
文本结构是在另一个标题中定义的,请将其称为
bar.h
,如果包含
bar.h
的文件首先包含
foo.h
,那么它就可以完美地编译。然而,它并不干净,不依赖这些先决条件通常是一种良好的做法

下面是一个非常简单的示例:

foo.h

typedef int myType;
typedef struct {
    myType x;
} myStruct;
bar.h

typedef int myType;
typedef struct {
    myType x;
} myStruct;
main.c

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

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

myStruct y;

int main(void) {
    return 0;
}
#include "bar.h"

myStruct z;
gcc-I.error.c-o error.o

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


谁定义变量,在哪里?这些文件位于哪些文件中<代码>s8
不是标准。此外,将def
char
键入有符号8是一个非常糟糕的主意,因为它可以是无符号的。你应该做的(从1999年开始)是使用
stdint.h
,而不是一些自制的垃圾类型。@Lundin(从1999年开始)-->自从你的交叉编译器提供商意识到21世纪是一件事以来。198X年的哭泣。(反正ARM编译器是最新的)Hello@Lundin,正如我说过的,我得到了这段代码。通常,我会像你说的那样使用'stdint.h'。但是,这是一个很大的代码(超过100k代码行),并且这个变量在代码中被广泛使用。它在arm微控制器的“typedef_arm.h”文件中定义。它被定义为有符号变量,因为它对微控制器的二进制计算很重要。如果这段代码来自一个头,则完全可能该头没有包含
s8
类型定义的所需包含,但包含有此错误的文件确实包含它,所以在编译时没有问题,但静态地说,头是不完整的。您好@TimF,我感谢您的回答!但是,我忘了提到,头文件的声明是这样的:
\ifndef\u PARAM\u H
\define\u PARAM\u H
code
\endif
我不太熟悉这种类型的声明,所以我不知道是否允许在这里声明头文件。是的。这个
PARAM_H
只是一个保护,防止您多次包含标题。标准做法是将其放在每个标题的顶部,标题的大写名称应为+H。在我的示例中,它将是
\u FOO\u H
\u BAR\u H
。看见如果我的回答有用,不要犹豫,投赞成票并接受它。顺便说一下,欢迎收看StackOverflow!谢谢@TimF!对我来说很好。谢谢你的热烈欢迎!:)