如何在.h中转发typedef'd结构

时间:2011-08-31 15:15:49

标签: c typedef forward-declaration

我有 Preprocessor.h

#define MAX_FILES 15

struct Preprocessor {
    FILE fileVector[MAX_FILES];
    int currentFile;
};

typedef struct Preprocessor Prepro;

void Prepro_init(Prepro* p) {
    (*p).currentFile = 0;
}

然后我意识到我必须将声明与定义分开。所以我创建了Preprocessor.c:

#define MAX_FILES 15

struct Preprocessor {
    FILE fileVector[MAX_FILES];
    int currentFile;
};

typedef struct Preprocessor Prepro;

Preprocessor.h现在是:

void Prepro_init(Prepro* p) {
    (*p).currentFile = 0;
}

显然,这是行不通的,因为Pr..h不知道Prepro类型。我已经尝试过几种组合,但都没有。我找不到解决方案。

6 个答案:

答案 0 :(得分:25)

typedef struct Preprocessor Prepro;移动到文件的标题和c文件中的定义以及Prepro_init定义。这将是向前宣布它没有问题。

Preprocessor.h

#ifndef _PREPROCESSOR_H_
#define _PREPROCESSOR_H_

#define MAX_FILES 15

typedef struct Preprocessor Prepro;

void Prepro_init(Prepro* p);

#endif

Preprocessor.c

#include "Preprocessor.h"

#include <stdio.h>

struct Preprocessor {
    FILE fileVector[MAX_FILES];
    int currentFile;
};

void Prepro_init(Prepro* p) {
    (*p).currentFile = 0;
}

答案 1 :(得分:8)

如果你想隐藏Preprocessor的定义,你可以简单地把它放在头文件中:

struct Preprocessor;
typedef struct Preprocessor Prepro;

但更一般地说,您可能还需要头文件中的Preprocessor定义,以允许其他代码实际使用它。

答案 2 :(得分:1)

您已将.c中的内容放入.h,反之亦然。 Prepro_init必须位于.c文件中,该文件必须为#include "Preprocessor.h"

答案 3 :(得分:-1)

YAS:又一个解决方案。

Preprocessor.h

<some code>
    void Prepro_init(Prepro* p) {
        (*p).currentFile = 0;
    }
<some code>

Preprocessor.c

#define MAX_FILES 15

struct Preprocessor {
    FILE fileVector[MAX_FILES];
    int currentFile;
};
typedef struct Preprocessor Prepro;

#include "Preprocessor.h"      //include after defining your structure.

         <some code> 
        {
              struct Prepro p;
              Prepro_init(p);
     <some code> 
          .... using p.currentFile.....
          .....using other members....
     <some code> 
        }
           <some code> 

现在它会起作用。我认为这是你的要求。希望它有所帮助。

<强>缺点:   结构预处理器的成员必须是预定的。即头文件使用成员currentFile。因此,包含Preprocessor.h的c文件必须具有类型定义为Prepro的结构,并且该结构必须包含成员currentFile。(在本例中)。

我在一年前遇到的同样问题,同时编写头文件以图形树格式显示用户Avl树。

答案 4 :(得分:-1)

我建议您遵循Linus [1],不要使用typedef struct。

如果您可以控制库:

包含文件

struct Foo;

int foo_get_n(const struct Foo *bar);

在实施档案

struct Foo
{int n;};

int foo_get_n(const struct Foo *bar)
{return bar->n;}

如果您无法控制库:

要求维护者从包含文件中删除这些污染类型的定义。

摘要

不要使用typedef struct。

[1] http://yarchive.net/comp/linux/typedefs.html

答案 5 :(得分:-2)

交换.h.c文件。在.c中添加标题。

另请参阅有关声明,定义和头文件的书籍。