函数无法识别typedef参数

时间:2015-02-14 16:01:52

标签: c function struct typedef argument-passing

好吧,我已经搜索了两天的解决方案,但我无法找到我的代码出错的地方。 ;(

任务很简单:使用typedef定义一个新类型,并让一个函数从文件中读出这种新类型的行,再次读出这个新类型的数组。所以我在headerfile中的typedef现在看起来像这样(我尝试了几种写这个的变体)

// filename: entries.h
#ifndef ENTRIES_H_
#define ENTRIES_H_
#include<time.h>

typedef struct{
    char Loginname[25];
    time_t RegDate;
    unsigned long Highscore;
    time_t Hdate;
}typePlayerEntry;

int readPlayerList(char *name, typePlayerEntry *feld);

#endif /* ENTRIES_H_ */

main.c:

//filename: main.c

#include <stdio.h>
#include "entries.h"


int main(void) {
    char name[13]="numbers.txt";
    typePlayerEntry *pep;

    readPlayerList(name, pep);

    return 0;
}

我的函数文件看起来像这样(并且显示错误的地方)

//filename: readPlayerList.c

int readPlayerList(char *name, typePlayerEntry *feld) {
return 0;
}

不相关的代码完全被遗漏了。该问题可通过发布的代码重现。

程序不会编译,因为无法识别函数文件中第二个参数的类型, - 这是奇怪的,因为它在头文件中定义,也可以在main函数中使用。 并且这个错误以某种方式连接到我的main.c中的(在本例中)一个类型为playerEntry的指针的声明。因此,如果我没有声明它,那么没有错误,虽然我必须声明它实际上将它赋予函数。到目前为止,解决方案是如何将entries.h包含到readPlayerList.c中,这对以前的函数来说不是必需的?

我正在使用eclipse kepler和MinGW,如果是编译器问题。

更正了time.h中缺少的包含并稍微调整了代码。

2 个答案:

答案 0 :(得分:0)

问题的一部分是编译器看到(至少)'playerEntry'名称的两个不同含义/定义。

推荐: 1)消除'typedef'语句 (它只是使代码混乱并使编译器混淆)

2)通过以下方式正确引用结构:  'struct playerEntry'而不是'playerEntry'

TheHeader.h文件中的

struct playerEntry
{
    char Loginname[25];
    time_t RegDate;
    unsigned long Highscore;
    time_t Hdate;
};

int readPlayerList(char *name, struct playerEntry *feld);
源文件中的

#include "TheHeader.h"
int readPlayerList(char *name, struct playerEntry *feld)
{
    return 0;
}

答案 1 :(得分:0)

您在entries.h中缺少#include <time.h>

// filename: entries.h
#ifndef ENTRIES_H_
#define ENTRIES_H_

typedef struct {
    char Loginname[25];
    time_t RegDate;                  /* from <time.h> */
    unsigned long Highscore;
    time_t Hdate;                    /* from <time.h> */
} playerEntry;

int readPlayerList(char *name, playerEntry *feld);

#endif /* ENTRIES_H_ */

你需要在readPlayerList.c中#include "entries.h"

//filename: readPlayerList.c

int readPlayerList(char *name, typePlayerEntry *feld) {
/*                             ^^^^^^^^^^^^^^^ from entries.h */
return 0;
}