结构体定义在头文件中被重复包含的问题

结构体定义在一个单独的头文件中,struct.htypedetstructstudent{inta;intb;}STU;然后有两个函数fun1和fun2,fun1.h为#... 结构体定义在一个单独的头文件中,
struct.h
typedet struct student
{
int a;
int b;
}STU;

然后有两个函数fun1和fun2,
fun1.h为
#include struct.h
void(int a, STU *studentone );

fun2中要使用到结构体,也要调用fun1,所以fun1需要包含
#include struct.h
#include fun2.h

这样就导致错误发生了,说结构体重定义,请问该如何修改?
因为还有其他子函数需要使用到结构体,所以结构体定义单独放在一个头文件中比较好。
修改一下::

fun2中要使用到结构体,也要调用fun1,所以fun1需要包含
#include struct.h
#include fun1.h
展开
 我来答
娱乐小八卦啊a
高粉答主

2020-05-10 · 娱乐小八卦,天天都知道
娱乐小八卦啊a
采纳数:256 获赞数:117828

向TA提问 私信TA
展开全部

这样说明,如果定义了头文件A.h,B.h和源文件C.cpp。如果我们在A.h中写上一个函数,在B.h中include A.h,然后再在C.cpp中include A.h和B.h,这样我们就会出现重复包含的问题。

出错分析:错误代码的提示:error C2084: function 'int sub(int,int)' already has a body,这说明sub函数已经存在了一个。因为在B.h中我们通过#include "A.h"导入了A.h的头文件。

而都知道头文件处理简单的来说就是将A.h中文件中的所有的东西全部的复制到#include <A.h>的定义所在的文件处。

扩展资料

结构体很重要,初学者一定要掌握。比如存储一个班级学生的信息,肯定包括姓名、学号、性别、年龄、成绩、家庭地址等项。这些项都是具有内在联系的,它们是一个整体,都表示同一个学生的信息。但如果将它们定义成相互独立的变量的话,就无法反映它们的内在联系:

char name[20];   //姓名

int num;         //学号

char sex;        //性别

int age;         //年龄

float score;     //成绩

char addr[30];   //家庭住址

而且问题是这样写的话,只是定义了一个学生,如果要定义第二个学生就要再写一遍。这样不仅麻烦,而且很容易混淆。要是能定义一个变量,而且这个变量正好包含这六个项,即将它们合并成一个整体的话就好了。

结构体就是为了解决这个问题而产生的。结构体是将不同类型的数据按照一定的功能需求进行整体封装,封装的数据类型与大小均可以由用户指定。

之前讲的那些基本数据类型只能满足一些基本的要求,只能表示具有单一特性的简单事物。但是对于一些有很多特性的复杂事物,每一个特性就是一个基本类型。这个复杂的事物是由很多基本类型组合在一起而生成的一个比较复杂的类型。这时就需要运用结构体。

光点科技
2023-08-15 广告
通常情况下,我们会按照结构模型把系统产生的数据分为三种类型:结构化数据、半结构化数据和非结构化数据。结构化数据,即行数据,是存储在数据库里,可以用二维表结构来逻辑表达实现的数据。最常见的就是数字数据和文本数据,它们可以某种标准格式存在于文件... 点击进入详情页
本回答由光点科技提供
YCY52025
推荐于2017-10-10
知道答主
回答量:6
采纳率:0%
帮助的人:7.7万
展开全部
#include "头文件",这种声明是本文件包含了所包含的头文件里面内容,这样该文件在预处理时就会把头文件里面包含的内容搬过来,用其内容来替换#include "头文件"这条语句,因此多个文件包含同一头文件,或间接包同一含头文件就如楼主这种情况,就会在fun2中产生两次(甚至多次的)typedet struct student
{
int a;
int b;
}STU;
这个结构体定义,因此会出现重定义错误,要避免这种情况需要使用条件编译处理如下
struct.h 这个头文件就应该这样写
#ifndef FUN_H//这个FUN_H是随便写,但建议有意义也不能和别的头文件相同。
#define FUN_H
typedet struct student
{
int a;
int b;
}STU;

#endif

fun1.h 这个头文件包涵struct.h 这个自定义头文件就应该进行条件编译处理如下写:
#ifndef FUN_H
#define FUN_H

#include "struct.h"
#endif
如果本头文件实现了函数就把函数声明放条件编译里面,函数定义放条件编译外面(一般都会是头文件只做函数原型声明,会在另一个源文件只做定义即实现,当然,对于内联函数有点点区别,楼主自己区别),这样一来fun1就该这样写:
#ifndef FUN_H
#define
#include "struct.h"

void(int a, STU *studentone );

#endif
void(int a, STU *studentone )
{
//函数实现,但是一般不建议在头文件实现函数,内联函数除外
}

这样一来在预处理时执行条件编译后就不会吧同一个相同的头文件的内容包含进来,一般发型项目都是会用到条件编译,防止其他人使用头文件产生重复定义,而无法查找错误,所以每个人建立自己的头文件都应该使用条件编译。
使用条件编译后就不会出现这种重复定义的错误,希望对楼主有帮助。

其实最简单的就是 因为在fun1.h内已经
#include struct.h
在fun2中就不需要#include struct.h了。
本回答被提问者采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
crank523
2011-11-25 · 超过26用户采纳过TA的回答
知道答主
回答量:283
采纳率:0%
帮助的人:200万
展开全部
具体说是这样的头文件"file1.h"里定义了一个宏变量#define MAXSIZE和一个头文件"file2.h"头文件前面写上#pragma once 或者
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
月亮爱赏黑夜2806
2011-11-25 · TA获得超过6.6万个赞
知道大有可为答主
回答量:4.2万
采纳率:0%
帮助的人:2961万
展开全部
应该可以用#ifdef #define #endif
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 1条折叠回答
收起 更多回答(2)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式