函数参数

时间:2015-09-16 16:27:09

标签: 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;  
    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文件中!

1 个答案:

答案 0 :(得分:1)

将评论转移到答案。

如果Garr Godfrey提供了答案,请接受它 - 他提供了第一个指向麻烦的指针。

指向问题的第一个指针

Garr Godfrey [评论]):

  

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

指向问题的扩展评论

Jonathan Leffler noted

  

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 …

需要一点时间才能适应这种规则,但它可以确保你跳过测试很多错误。