C 函数参数中的类型名称未知

C 函数参数中的类型名称未知,c,compiler-errors,header,driver,C,Compiler Errors,Header,Driver,我有这个头文件 // Bunch of constants defined first typedef char Token[MAX_TOKEN + 1]; typedef struct { Token szToken; int iCategory; int iSubcategory; int iPrecedence; } Element; typedef struct { int iCount; E

我有这个头文件

// Bunch of constants defined first

typedef char Token[MAX_TOKEN + 1];

typedef struct
{
    Token szToken;      
    int iCategory;      
    int iSubcategory;   
    int iPrecedence;    
} Element;

typedef struct
{
    int iCount;  
    Element stackElementM[MAX_STACK_ELEM];
} StackImp;

typedef StackImp *Stack;

typedef struct
{
    int iOutCount;
    Element outM[MAX_OUT_ITEM];
} OutImp;

typedef OutImp *Out;

// Stack functions

void push(Stack stack, Element value);
Element pop(Stack stack);
int isEmpty(Stack stack);
Stack newStack();
void freeStack(Stack stack);
Element topElement(Stack stack);

void categorize(Element *pElement);
Out newOut();
void addOut(Out out, Element element);
void printOut(Out out);

int convertToPostfix(char *pszInfix, Out out); // This is confusing me...

void ErrExit(int iexitRC, char szFmt[], ...);
char * getToken(char *pszInputTxt, char szToken[], int iTokenSize);
这个头被一个调用
int convertToPostfix(char*pszInfix,Out)
的驱动程序使用。问题是我在编译器中一直将
未知类型名'Out'
作为一个错误。convertToPostfix函数假定使用一个令牌来指示是否存在任何错误,并通过一个addOut函数(在驱动程序中)填充out数组,但是我不能做任何事情,因为这个错误阻止我编译
convertToPostfix()
函数不是驱动程序的一部分,如果这很重要的话,它在一个单独的C文件中

任何帮助都会很好

编辑:我首先为驱动程序生成一个.o文件,然后对.c文件convertToPostfix()执行相同的操作,现在就是这样

编译程序

gcc -g -c -o myDriver.o myDriver.c //Complies fine.
gcc -g -c -o pretoPost.o pretoPost.c
pretoPost.c:7:38: error: unknown type name ‘Out’
 int convertToPostfix(char *pszInfix, Out out)
我得到了错误

编辑2:非常感谢人们的帮助!错误在于我没有将
#include“header.h”
包含到pretoPost.c文件中

将评论转换为答案

如果Garr Godfrey提供了一个答案,请接受它-他提供了问题的第一个指针

问题的第一个指针 [点评]:

“单独的C文件”-这是否意味着它也正在被编译?是错误显示的文件中实际包含的头,因为它应该是

指向该问题的扩展评注 :


pretoPost.c
是否有
#在其中包含“summary.h”
(其中“
summary.h
”是您未命名的头文件)?如果没有,那就是问题所在

:

请注意,错误消息是关于
pretoPost.c
不理解
Out
,而不是关于头不理解
Out

这似乎就是问题所在

另外请注意,您还没有特别为
newStack()
newOut()
定义原型。您已声明函数存在,但未指定参数列表,因此允许任何数量和任何类型的值。您需要
Out newOut(void)
堆叠新闻钉(无效)
声明函数的原型。这是C,不是C++中的C++,规则会不同。(如果你的教授提供了标题,那么这可能只是草率的编码。)

这是一个常见的误解。函数声明,例如:

void *somefunction();
简单地说,
somefunction
存在并返回一个
void*
值。它没有参数类型或数量的直接说明,但函数不能是可变的(如
printf()
,采用可变数量的参数),因为在使用可变函数之前,必须始终在范围内有一个原型。要说“无参数”,C需要:

void *somefunction(void);
现在你有了一个原型。如果使用GCC编译,请考虑:

gcc -std=c11 -Wall -Wextra -Werror -Wmissing-prototypes -Wstrict-prototypes …

这需要一段时间来适应这一规则,但它可以确保您跳过测试许多错误。

这是您遇到的第一个错误吗?Header似乎缺少“}元素”后面的一行;最好不要使用
typedef
指针,除非在阅读代码主体时使用某种驼峰或匈牙利符号来明确说明。例如
pOut
“分离C文件”。这是否意味着它也在被编译。是错误显示的文件中实际包含的标题,因为它应该是。@Garry Godfrey Woops我编辑了这篇文章,以便在元素之后有一行;但这是我到目前为止遇到的第一个也是唯一一个错误,因为我无法进一步编译。这个“单独的C文件”也正在编译中。当我试图编译它(gcc-g-c-ocs2123p1.ocs2123p1.c)时,我得到了错误@风向标标题和驱动程序在我的教授提供的地方,有人建议我不要弄乱它们。
pretoPost.c
是否有
#在其中包含“神秘.h”
(其中
“神秘.h”
是您未命名的标题文件)?如果没有,那就是问题所在。另外请注意,您还没有特别为
newStack()
newOut()
定义原型。您已声明函数存在,但未指定参数列表,因此允许任何数量和任何类型的值。您需要
Out newOut(void)
堆叠新闻钉(无效)
声明函数的原型。这是C,不是C++中的C++,规则会不同。(如果你的教授提供了标题,那么这可能只是草率的编码。)谢谢你提供更详细的解释!不幸的是,由于没有超过15名代表,我不能投票支持人民的反应,所以感谢约翰纳森·加尔和天气的反应!