【问题标题】:What is wrong with this? C这有什么问题? C
【发布时间】:2015-02-28 07:25:28
【问题描述】:

我无法找到我的错误。这是structures.h中的定义

typedef struct book {
  bank_account_t **accounts;
  transaction_t **transactions;
} book_t;

这里是functions.c,我在其中包含标题并尝试使用类型book_t

#include "structures.h"

void load_book(book_t *book) {

}

但我收到此错误

functions.c:10:16: error: unknown type name ‘book_t’
 void load_book(book_t *book) {
                ^

使用以下更多代码进行编辑:

在我的main 文件中,我像这样订购了我的.h 文件

#include "structures.h"
#include "functions.h"

structures.h

#ifndef STRUCTURES_H
# define STRUCTURES_H


typedef struct bank_account {
  char *name;
  int amount;
} bank_account_t;

typedef struct transaction {
  char *name;
  int amount;
} transaction_t;

typedef struct book {
  bank_account_t **accounts;
  transaction_t **transactions;
} book_t;

#endif

function.c

#include <stdio.h>

#include "functions.h"
#include "structures.h"
#include "bank_account.h"
#include "transaction.h"

void load_book(book_t *book) {

}

void init_book() {

}

bank_account.h

#ifndef BANK_ACCOUNT_H
# define BANK_ACCOUNT_H

void init_new_bank();
void deinit_new_bank();

#endif

transaction.h

#ifndef TRANSACTION_H
# define TRANSACTION_H

#endif

【问题讨论】:

  • 不是 book_t 仅在结构中有效吗?
  • 您可能从您使用的另一个头文件中复制粘贴了头文件,却忘记调整头文件保护?
  • 出于调试目的,在book_t 的定义之后的行中包含一个#error choke 或只是一些垃圾,并查看编译器是否会阻塞它。
  • All downvoters:这是一个初学者的调试问题。所以很难提供更多信息,因为如果 OP 知道在哪里看,他/她就不会来这里了。
  • 请同时显示functions.h

标签: c types header-files


【解决方案1】:

我认为问题一定出在functions.h中(原帖中没有包含)。

functions.h

#ifndef FUNCTIONS_H
# define FUNCTIONS_H

/* [MarkU] required: include definition of book_t */
#include "structures.h"

void load_book(book_t *book);
void init_book();

#endif

没有#include structures.h,就没有boot_t类型的定义。

使用 mingw32-gcc 4.7.2 构建和验证。省略#include,我会看到错误消息。

【讨论】:

    【解决方案2】:

    functions.c 中更改它们的顺序:

    #include "functions.h"
    #include "structures.h"
    

    成为

    #include "structures.h"
    #include "functions.h"
    

    微妙之处在于错误消息来自functions.c 而不是来自functions.h

    假设原型为load_book(book_t *) in functions.h,它需要知道book_t

    因此,最佳解决方案是将structures.h 包含在functions.h 中(正如MarkU's answer 已经指出的那样)。

    经验教训:始终(且仅)包含您需要的内容和需要的位置。避免(微妙的)依赖。

    【讨论】:

    • 这也是我的猜测。
    • 没用。 structures.h 是我调用的第一个标头,它不包括 functions.h
    • @waterdowner:请注意,您显示的错误并非源自编译 main.c,而是源自编译 functions.c,因此 main.c 中包含的顺序根本不重要。
    • @alk 是的,抱歉,刚刚发现。但我仍然遇到同样的错误:(
    • @alk haha​​ 不,也不是这样!我编辑了错误的structures.h 文件...
    猜你喜欢
    • 2023-03-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-04-11
    • 1970-01-01
    相关资源
    最近更新 更多