我正在创建一个函数,其中我需要两个不同的 struct 位于不同的文件中,所以我try 将文件包含在彼此内部,这对第一个函数有效,但其他函数给我这个错误

错误:未知的类型名称‘Actives’

"Activity"是文件中的 struct 类型

文件companies. h,其中错误是

#ifndef COMPANIES_H
#define COMPANIES_H

#ifdef __cplusplus
extern "C" {
#endif

#include "activities.h"

#define COMPANY_INITIAL_SIZE 20
#define COMENT_INITIAL_SIZE 2
#define SEARCHES_INITIAL_SIZE 20
#define RATING_INITIAL_SIZE 2

#define TEXT_MAX_SIZE 200
#define NAME_MAX_SIZE 50
#define EMAIL_MAX_SIZE 50
#define TITLE_MAX_SIZE 50
#define ADDRESS_MAX_SIZE 70
#define LOCATION_MAX_SIZE 70
#define CATEGORY_MAX_SIZE 30

#define NIF_MIN_SIZE 100000000
#define NIF_MAX_SIZE 999999999


    enum category {
        microCompany = 1, pmeCompany, macroCompany
    };

    enum state {
        inactive, active
    };

    enum searchCamp {
        nif, businessArea, nameLocation
    };

    enum comentState {
        hidden, visible
    };

    typedef struct {
        char title[TITLE_MAX_SIZE];
        char text[TEXT_MAX_SIZE];
        char userName[NAME_MAX_SIZE];
        char userEmail[EMAIL_MAX_SIZE];
        enum comentState states;
    } Coment;

    typedef struct {
        int nota;
        char userName[NAME_MAX_SIZE];
        char userEmail[EMAIL_MAX_SIZE];
    } Rating;

    typedef struct {
        int Nif;
        char name[NAME_MAX_SIZE];
        enum category categories;
        int businessAreaCode;
        enum state states;
        char address[ADDRESS_MAX_SIZE];
        char location[LOCATION_MAX_SIZE];
        int postalCode;
        int comentCounter, comentSize;
        Coment *coments;
        int ratingCounter, ratingSize;
        Rating *ratings;
    } Company;

    typedef struct {
        int counter, size;
        Company *companies;
    } Companies;

    void freeCompanies(Companies *);
    void loadCompanyFile(Companies *, char*);
    void saveCompanyFile(Companies *, char *);
    void insertCompanies(Companies *, Activities *); //<- line that gives the error
    void insertComents(Companies *);
    void insertRatings(Companies *);
    void expandCompanySize(Companies *);
    void searchNifCompanies(Companies);
    void printCompany(Companies, int);
    void editCompanies(Companies *);
    char* getStringCategory(Companies *, int);
    char* getStringState(Companies *, int);
    void searchNameCompanies(Companies);
    void removeCompanies(Companies *);
    void removeComents(Companies *);
    void AlterComentState(Companies *);

#ifdef __cplusplus
}
#endif

文件activities.h在哪里工作:

#ifndef ACTIVITIES_H
#define ACTIVITIES_H

#include "companies.h"

#ifdef __cplusplus
extern "C" {
#endif

#define ACTIVITIES_INITIAL_SIZE 20
    
    typedef struct {
        int activityCode;
        char name[NAME_MAX_SIZE];
        enum state states;
    } Activity;

    typedef struct {
        int activityCounter, size;
        Activity *activities;
    } Activities;
    void loadActivityFile(Activities*,char*);
    void saveActivityFile(Activities*,char*);   
    void insertActivities(Activities*);
    void removeActivities(Activities*, Companies*);
    void editActivities(Activities*);
    void changeActivityState(Activities*);
    int verifyActivityUse(Companies*, Activities*, int);
    

#ifdef __cplusplus
}
#endif

#endif /* ACTIVITIES_H */

推荐答案

在文件范围内的类型定义和类型定义声明在文件末尾是可见的,不包括它们被同一标识符的不同定义所遮蔽的任何位置.

在您的例子中,首先包含两个头中的哪一个并不重要.无论哪种方式,依赖于两个主要类型之一的函数声明将出现在该类型的定义之前的某个点.

解决此类循环问题的最常用方法是使用forward(struct)声明,但这实际上是一个问题,因为您使用的是未标记的 struct 类型. 不能正向声明未标记的 struct 类型,因为以后无法完成该类型,尽管可以通过添加标记来启用该功能.

然而,在您的特定情况下,看起来您也可以通过将类型定义分解到它们自己的头中来解决循环,与函数声明分开. 然后,每个当前头都对具有类型定义的头执行#include,而不是它们彼此执行#include.

C++相关问答推荐

如何避免使用相对路径包含在c中

从内联程序集调用Rust函数和调用约定

我应该如何解决我自己为iOS编译的xmlsec1库的问题?转换Ctx.first在xmlSecTransformCtxPrepare()之后为空

编译的时候g++通常会比GCC慢很多吗?

如何使fputs功能提示错误输入并要求用户重新输入.程序停止而不是请求新的输入

#If指令中未定义宏?

Vcpkg的配置文件

当b是无符号字符时,int a=(b<;<;2)>;>;2;和int a=b&;0x3F;之间有什么区别?

如何将C中的两个字符串与从文件接收的字符串中的字符数进行比较

理解bzip2的BZ2_解压缩函数中的状态重新分配

C语言中浮点数的取整方式浮点数尾数超过23位时如何取整剩余部分

如何在不读取整个字符串的情况下删除UTF8字符串的尾随空格以提高性能?

从另一个宏函数调用C宏

向左移位3如何得到以字节为单位的位数?

可以';t从A9G模块拨打电话

Struct 内的数组赋值

在链表中插入一个值

快速准确计算double的小数指数

C simd _m128 晶圆厂

返回指向函数内声明的复合文字的指针是否安全,还是应该使用 malloc?