结构体定义在头文件中被重复包含的问题
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.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]; //家庭住址
而且问题是这样写的话,只是定义了一个学生,如果要定义第二个学生就要再写一遍。这样不仅麻烦,而且很容易混淆。要是能定义一个变量,而且这个变量正好包含这六个项,即将它们合并成一个整体的话就好了。
结构体就是为了解决这个问题而产生的。结构体是将不同类型的数据按照一定的功能需求进行整体封装,封装的数据类型与大小均可以由用户指定。
之前讲的那些基本数据类型只能满足一些基本的要求,只能表示具有单一特性的简单事物。但是对于一些有很多特性的复杂事物,每一个特性就是一个基本类型。这个复杂的事物是由很多基本类型组合在一起而生成的一个比较复杂的类型。这时就需要运用结构体。
{
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了。