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名代表,我不能投票支持人民的反应,所以感谢约翰纳森·加尔和天气的反应!