头文件包含的问题

时间:2021-03-17 16:45:05
我想在两个对话框中使用同一个类,结果include了两次这个类的头文件,结果编译通过了,连接时报错
  fatal error LNK1169: one or more multiply defined symbols found
 "public: __thiscall CSpreadSheet::CSpreadSheet(class CString,class CString,bool)" (??0CSpreadSheet@@QAE@VCString@@0_N@Z) already defined in EditExecl.obj
应该是说在两个obj文件中重复定义了类?如果不加,又说没有定义这个类,不能通过编译,请问如何解决,谢谢。

18 个解决方案

#1


没人复我的?
自己顶一下先

#2


应该这是违背一次定义的原则的,你先include一次试试看?

#3


但是只在其中一个对话框中include的话,在另外一个对话框中就不能使用这个自定义的类阿

#4


在.h中加上宏  #ifndef ... #define ... #endif;

#5


extern

#6


那你在 文件1.h 中包含这个头文件,然后在 文件2 中包 含文件1.h

#7


anothervip(cadet) 的是标准做法,格式为:
#ifndef _YOUR_INCLUDE_
#define _YOUR_INCLUDE_

(头文件主体)

#endif
其中_YOUR_INCLUDE_可以是你喜欢的其他符号

#8


用extern的话,一样是不行阿。我是这样用的,在对话框的cpp文件中,extern class SS
不可以阿。各位能解释清楚#ifndef 的写法吗?

#9


#if !defined(AFX_BACKUPDATA_H__12CB1686_D72C_45A0_8419_1D4B2D408E23__INCLUDED_) 
#define AFX_BACKUPDATA_H__12CB1686_D72C_45A0_8419_1D4B2D408E23__INCLUDED_

(头文件)

#endif

简单的条件编译:第一次编译该头文件时没有define(AFX_BACKUPDATA_H__12CB1686_D72C_45A0_8419_1D4B2D408E23__INCLUDED_),此时!defined(AFX_BACKUPDATA_H__12CB1686_D72C_45A0_8419_1D4B2D408E23__INCLUDED_)为真, 则编译头文件代码。 
再一次包含该头问件时,给文件已经编译,!defined(AFX_BACKUPDATA_H__12CB1686_D72C_45A0_8419_1D4B2D408E23__INCLUDED_)为False ,就不在编译头文件代码。

#10



CSpreadSheet是个控件吧(不会是楼主自己写的吧)

在生成EditExecl.obj
的相关文件里 重复定义了CSpreadSheet::CSpreadSheet(class CString,class CString,bool)。
并不是.h重复定义的问题。
是生成了两个相同函数的实体,在连接的时候Link程序无法选择的问题。

#11


可以删除中间文件重新编译。

#12


是不是把类的实现代码放在了.h文件中了?

#13


这和头文件包含没有关系,看看你的实现代码

#14


如果是VC7,直接在头文件前面加一句#pragma once就可以了

#15


编译器这样提示应该不是你把头文件包含两次的问题,如果你的代码没问题的话,这样使用是可以的

#16


CSpareadSheet确实是一个控件,类代码的实现也是在头文件中,应该是zhuzhufox(狐狸的小猪)所说的问题了,但是删除了中间文件好像还是不行阿

#17


大家再帮帮忙喔~

#18


ServiceMain.obj : error LNK2005: "struct _COMPLETION_IO_OPERATION_HEAD  Completion_Operation_Head" (?Completion_Operation_Head@@3U_COMPLETION_IO_OPERATION_HEAD@@A) already defined in KernelProcess.obj

#1


没人复我的?
自己顶一下先

#2


应该这是违背一次定义的原则的,你先include一次试试看?

#3


但是只在其中一个对话框中include的话,在另外一个对话框中就不能使用这个自定义的类阿

#4


在.h中加上宏  #ifndef ... #define ... #endif;

#5


extern

#6


那你在 文件1.h 中包含这个头文件,然后在 文件2 中包 含文件1.h

#7


anothervip(cadet) 的是标准做法,格式为:
#ifndef _YOUR_INCLUDE_
#define _YOUR_INCLUDE_

(头文件主体)

#endif
其中_YOUR_INCLUDE_可以是你喜欢的其他符号

#8


用extern的话,一样是不行阿。我是这样用的,在对话框的cpp文件中,extern class SS
不可以阿。各位能解释清楚#ifndef 的写法吗?

#9


#if !defined(AFX_BACKUPDATA_H__12CB1686_D72C_45A0_8419_1D4B2D408E23__INCLUDED_) 
#define AFX_BACKUPDATA_H__12CB1686_D72C_45A0_8419_1D4B2D408E23__INCLUDED_

(头文件)

#endif

简单的条件编译:第一次编译该头文件时没有define(AFX_BACKUPDATA_H__12CB1686_D72C_45A0_8419_1D4B2D408E23__INCLUDED_),此时!defined(AFX_BACKUPDATA_H__12CB1686_D72C_45A0_8419_1D4B2D408E23__INCLUDED_)为真, 则编译头文件代码。 
再一次包含该头问件时,给文件已经编译,!defined(AFX_BACKUPDATA_H__12CB1686_D72C_45A0_8419_1D4B2D408E23__INCLUDED_)为False ,就不在编译头文件代码。

#10



CSpreadSheet是个控件吧(不会是楼主自己写的吧)

在生成EditExecl.obj
的相关文件里 重复定义了CSpreadSheet::CSpreadSheet(class CString,class CString,bool)。
并不是.h重复定义的问题。
是生成了两个相同函数的实体,在连接的时候Link程序无法选择的问题。

#11


可以删除中间文件重新编译。

#12


是不是把类的实现代码放在了.h文件中了?

#13


这和头文件包含没有关系,看看你的实现代码

#14


如果是VC7,直接在头文件前面加一句#pragma once就可以了

#15


编译器这样提示应该不是你把头文件包含两次的问题,如果你的代码没问题的话,这样使用是可以的

#16


CSpareadSheet确实是一个控件,类代码的实现也是在头文件中,应该是zhuzhufox(狐狸的小猪)所说的问题了,但是删除了中间文件好像还是不行阿

#17


大家再帮帮忙喔~

#18


ServiceMain.obj : error LNK2005: "struct _COMPLETION_IO_OPERATION_HEAD  Completion_Operation_Head" (?Completion_Operation_Head@@3U_COMPLETION_IO_OPERATION_HEAD@@A) already defined in KernelProcess.obj