【问题标题】:How to use forward declaration in C?如何在 C 中使用前向声明?
【发布时间】:2025-12-24 02:15:06
【问题描述】:

我正在编写 C 程序,但在 Stack Overflow 上找不到等效示例。我有 2 个文件,level.h,lib.h,这取决于另一个文件中定义的类型。这会产生错误redefinition of typedef 'metalevel_t'/'entry_t' is a C11 feature

level.h:

#ifndef level_H
#define level_H
#include "lib.h"

// level.h
typedef struct metalevel metalevel_t; 


// key value pairs, value are integers 
typedef struct entry {
    ...
} entry_t;

lib.h:

typedef struct entry entry_t;
typedef struct metalevel{
    entry_t* ...; 
} metalevel_t;

metalevel_t Info[...]; 

但是,如果我将 entry_t(和 metalevel_t)替换为以下内容,则会收到 typedef requires a name 错误。

struct entry {
    ...
};

我的 Makefile 看起来像这样:

CC=gcc
CFLAGS=-I.
CFLAGS=-std=c99
LDFLAGS = -lm

macro_main: macro_main.o lsm.o lib.o level.o
    $(CC) -o macro_main macro_main.o lsm.o lib.o level.o $(CFLAGS) 

macro_main.o: 

clean: 
      $(RM) macro_main 

在这种情况下如何使用前向声明?

【问题讨论】:

  • level.h 中删除typedef struct metalevel metalevel_t;。该文件无论如何都包含lib.h,因此它可以看到现有的typedef。

标签: c typedef forward-declaration


【解决方案1】:

level.h:

#include "lib.h"

struct entry {
    // ...
};

lib.h:

typedef struct entry entry_t;
typedef struct metalevel{
    entry_t* p;
} metalevel_t;

不确定您所说的 metalevel_t Info[...]; 是什么意思,这可能会导致 ... 的任何可能内容出错。

【讨论】:

  • 很抱歉,如果这具有误导性。 metalevel_t Info[...] 中的“...”是一些预定义的大小。
  • @Pippi:你是在标题中声明那个数组吗?如果是,那么包含该标头的每个源文件最终都会重新声明它(这很糟糕)。
  • @Pippi 在这种情况下应该是extern metalevel_t Info[5];
  • 谢谢!我尝试了这个解决方案,它摆脱了entry_t 错误,但不是metalevel_t 错误:redefinition of typedef 'metalevel_t' is a C11 feature
  • @Pippi 这意味着您的代码不是我建议的方式。 (确保 lib.h 和 level.h 都有包含保护,为了简洁我省略了它们)