我有这个头文件。
// 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)
的驱动程序使用,问题是我在编译器中将unknown type name '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文件中!
答案 0 :(得分:1)
将评论转移到答案。
如果Garr Godfrey提供了答案,请接受它 - 他提供了第一个指向麻烦的指针。
Garr Godfrey [评论]):
“单独的C文件” - 这是否意味着它正在被编译?标题是否实际包含在错误显示的文件中,因为它应该是。
pretoPost.c
中是否有#include "mystery.h"
(其中“mystery.h
”是您未命名的头文件)?如果没有,那就麻烦了。
and:
请注意,错误消息大约是
pretoPost.c
,不了解Out
,而不是了解不了解Out
的标题。
这似乎是问题!
另请注意,您尚未定义
newStack()
或newOut()
的原型。您已声明函数存在,但您尚未指定参数列表,因此允许使用任何数字和任何类型的值。您需要Out newOut(void);
和Stack newStack(void);
来声明函数的原型。这是C,而不是C ++ - 在C ++中,规则会有所不同。 (如果他提供标题,这可能只是你的教授的草率编码。)
这是一种常见的误解。函数声明,例如:
void *somefunction();
只是说somefunction
存在并返回void *
值。它没有直接指定参数的类型或数量,但函数不能是可变参数(如printf()
,采用可变数量的参数)因为你必须总是有一个在使用可变参数函数之前,在范围内使用原型。要说“没有参数”,C要求:
void *somefunction(void);
现在你有一个原型。如果您使用GCC进行编译,请考虑:
gcc -std=c11 -Wall -Wextra -Werror -Wmissing-prototypes -Wstrict-prototypes …
需要一点时间才能适应这种规则,但它可以确保你跳过测试很多错误。