ZKX's LAB

结构体定义在头文件中被重复包含的问题 结构在头文件中定义重复引用会出错

2020-07-22知识17

结构体定义在头文件中被重复包含的问题 #include\"头文件\",这种声明是本文件包含了所包含的头文件里面内容,这样该文件在预处理时就会把头文件里面包含的内容搬过来,用其内容来替换#include\"头文件\"这条语句,因此多个文件包含同一头文件,或间接包同一含头文件就如楼主这种情况,就会在fun2中产生两次(甚至多次的)typedet struct student{int a;int b;}STU;这个结构体定义,因此会出现重定义错误,要避免这种情况需要使用条件编译处理如下struct.h 这个头文件就应该这样写ifndef FUN_H/这个FUN_H是随便写,但建议有意义也不能和别的头文件相同。define FUN_Htypedet struct student{int a;int b;}STU;endiffun1.h 这个头文件包涵struct.h 这个自定义头文件就应该进行条件编译处理如下写:ifndef FUN_Hdefine FUN_Hinclude\"struct.hendif如果本头文件实现了函数就把函数声明放条件编译里面,函数定义放条件编译外面(一般都会是头文件只做函数原型声明,会在另一个源文件只做定义即实现,当然,对于内联函数有点点区别,楼主自己区别),这样一来fun1就该这样写:ifndef FUN_Hdefineinclude\"struct.hvoid(int a,STU*studentone);endifvoid(int a,STU*studentone){函数实现,但是一般。结构体定义在头文件中被重复包含的问题 结构体定义在一个单独的头文件中,struct.htypedet struct student{ int a;int b;}STU;然后有两个函数fun1和fun2,fun1.h为#include。这个问题,C语言,一个关于头文件重复定义的问题!!!?? 1.是链接出错吧不知道你有没有手工编写过makefile这么说吧 C语言的编译过程分为编译和链接编译之前有一个预处理编译的最小单位是单个文件也就说预处理的最小单位也是单个文件假设工程中有 a.c b.c两个文件 都包含了globle.h那么对a编译的时候,globle只包含一次 生成的 a.o 中包含了 a_s32 b_s32(即你定义的变量)对b编译的时候同样会包含globle.h 而且只包含一次所谓只包含一次 是在单个c/cpp文件中只包含一次这样在object中就会有多个相同命名的变量被包含进去链接的时候就会出错出错不会出现在编译过程中的2.可以包含任何语句C语言中,自定义的两个头文件里同事包含了同样的宏定义和同样的结构体,同时使用这两个头文件时出错 <;file1.h>;#ifdef MAXSIZEelsedefine MAXSIZEtypedef struct tdate{int year;int month;int day;}list;endififdef MAXSIZEelsedefine MAXSIZEtypedef struct tdate{int year;int month;int day;}list;endifincludeinclude\"htest1.hinclude\"htest2.hvoid main(){tdate sd;sd.year=2010;sd.month=9;sd.day=14;cout年\"月\"日\";}现在明白了么?求问个c语言问题 为什么含有结构类型的源文件引用头文件会出错,而将头文件中函数合并到源文件里就不会 这个要具体看看你的代码了。C++中头文件中定义全局变量,出现重复定义的错误 最好把程序贴出来看看关于自定义头文件在多个文件中引用时提示重复定义的问题(C语言) #ifndef identifier_hdefine identifier_hendif这套条2113件编译是为了防止同一个.c文件5261中包含多个相同.h文件的(比如有4102一个.c文件包含了a.h,a.h又包含了b.h,那1653么当你在这个.c文件中同时包含了a.h和b.h时,因为有上面的条件编译的关系而不会出错)。因为编译器在编译的时候是按照.c文件为单位编译的,每个.c文件编译成.o文件(linux系统)或者.obj(windows系统),然后再将这些.o文件链接起来,最后与运行库链接形成可执行文件(elf或exe文件)。你在两个.c文件中包含了同一个.h文件。这根本和条件编译没什么关系。你在.h文件中定义了全局变量a,b,c。那么就表示你两个.c文件中,每个.c文件中都有这样的全局变量定义:int a,b,c;当每个.c文件单独编译当然没有问题,但是当它们链接起来的时候就出现问题了:两个.c文件中都有变量a b c,所以当然是重复定义啊。问题是出在链接的时候的。这个问题,C语言,一个关于头文件重复定义的问题。。。?? 1.是链接出错吧不知道你有没有手工编写过makefile这么说吧 C语言的编译过程分为编译和链接编译之前有一个预处理编译的最小单位是单个文件也就说预处理的最小单位也是单个文件假设工程中有 a.c b.c两个文件 都包含了globle.h那么对a编译的时候,globle只包含一次 生成的 a.o 中包含了 a_s32 b_s32(即你定义的变量)对b编译的时候同样会包含globle.h 而且只包含一次所谓只包含一次 是在单个c/cpp文件中只包含一次这样在object中就会有多个相同命名的变量被包含进去链接的时候就会出错出错不会出现在编译过程中的2.可以包含任何语句关于头文件重复包含问题 重复包含的影响:在预处理对时候,include相同的文件,预处理器会检查XXX是否有定义再决定要不要复制内容,重复包含会是编译器多检查几次而已。另外在使用增量编译的时候,这个文件变化,所有 include 这个文件的文件都需要重新编译,即使没有去使用里面的任何内容。避免方法:1.把头文件放在宏里:ifndef 标志(这个标志本来可以随便自己定义,但是为了防止混乱,所以一般都会采用自己的文件名字:_WENJIAN_H_)define 标志文件内容endif在头文件定义前面添加pragma once(不太通用)就可以防止一个头文件被多次包含,进而防止重复定义的错误。在用VC6.0向导生成的头文件中,经常可以看见如下的代码段:if。defined(AFX_RESIZABLELAYOUT_H_INCLUDED_)define AFX_RESIZABLELAYOUT_H_INCLUDED_if_MSC_VER>;1000pragma onceendif/_MSC_VER>;1000endif/。defined(AFX_RESIZABLELAYOUT_H_INCLUDED_)对于宏有基本了解的朋友应该都知道,头文件中如下的宏定义,是为了避免同样的头文件在同一个.C文件或者.CPP文件多次包含。if。defined(XXX)define XXXendif这很好理解,但接下来的一段,尤其是#pragma once的意思,我就不是很清楚了。从MSDN得到pragma once的。

随机阅读

qrcode
访问手机版