错误:包含文件时类型名称未知

问题描述 投票:0回答:1

我正在创建一个函数,其中我需要位于不同文件中的两个不同结构,因此我尝试将文件包含在彼此内部并且它适用于第一个函数,但其他函数给了我这个错误

错误:未知类型名称“活动”

“Activities”是文件中的结构类型

文件company.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 */
c data-structures
1个回答
0
投票

文件范围内的类型定义和 typedef 声明从它们出现的位置到文件末尾都是可见的,不包括它们被同一标识符的不同定义遮盖的任何位置。

在您的情况下,首先包含两个标头中的哪一个并不重要。无论哪种方式,依赖于两种主要类型之一的函数声明都会出现在该类型定义之前的某个位置。

解决此类循环问题的最通用方法是使用前向 (

struct

) 声明,但这对您来说实际上是一个问题,因为您使用的是未标记的结构类型。您无法转发声明未标记的结构类型,因为稍后无法完成该类型,尽管您可以通过添加标记来启用该类型。

但是,在您的特定情况下,您似乎还可以通过将类型定义分解到它们自己的标头中(与函数声明分开)来解决循环性。然后,每个当前标头

#include

 都是具有类型定义的标头,而不是它们 
#include
 互相连接。

© www.soinside.com 2019 - 2024. All rights reserved.