hur.cn - 华软网

 热门搜索

头文件包含和重定义问题

  作者:未知    来源:网络    更新时间:2011/1/15
我在a.h中写了一个函数(直接把函数写在.h中,没有用cpp)

然后我把这个a.h包括到stdafx.h中

再在其它地方调用a.h中的函数,结果出现重定义毛病。

我把函数声明写在a.h,定义写在cpp资料里就没有问题了。

请问为什么?
---华软 网友回答---
H资料在编译时会被直接插入到CPP资料中去的,你的a.h被包括了屡次,那么这个函数就相当于有多个实现,当然会重定义了。
---华软网友回复---
采取预编译指令
---华软网友回复---
引用 1 楼 wltg2001 的回复:
H资料在编译时会被直接插入到CPP资料中去的,你的a.h被包括了屡次,那么这个函数就相当于有多个实现,当然会重定义了。

tks.
可是我在.h里定义的类为什么就没事呢?
---华软网友回复---
引用 3 楼 zjfhgdx 的回复:
引用 1 楼 wltg2001 的回复:
H资料在编译时会被直接插入到CPP资料中去的,你的a.h被包括了屡次,那么这个函数就相当于有多个实现,当然会重定义了。

tks.
可是我在.h里定义的类为什么就没事呢?

类又不是变量或是函数,那只是一个类型。
---华软网友回复---
引用 4 楼 wltg2001 的回复:
引用 3 楼 zjfhgdx 的回复:
引用 1 楼 wltg2001 的回复:
H资料在编译时会被直接插入到CPP资料中去的,你的a.h被包括了屡次,那么这个函数就相当于有多个实现,当然会重定义了。

tks.
可是我在.h里定义的类为什么就没事呢?

类又不是变量或是函数,那只是一个类型。

可是类里面也有函数的定义啊。
你说:H资料在编译时会被直接插入到CPP资料中去的。
那类不是要重定义了。
---华软网友回复---
引用 2 楼 visualeleven 的回复:
采取预编译指令

厚着脸皮向大大讨个简单例子。
---华软网友回复---
#ifndef _MYSTACK_H
#define _MYSTACK_H

---华软网友回复---
#pragma once
---华软网友回复---
引用 7 楼 yiruirui0507 的回复:
#ifndef _MYSTACK_H
#define _MYSTACK_H

正解。
或用楼上的:#pragma once
防止二次包括。
尤其:如果你想把全局 变量放在头资料里,那就完全错了,而且出现的问题异常诡异!
千万不要把全局非静态变量放在头资料里。否则极可能发现2个cpp资料里面修改的变量互相不看来!
当然了,常量是没问题的,由于你不改变它。最好用下面的方法:
C++">//*.h 头资料里声明,大概义,函数也一样。只申明。
extern int a ;

//*.cpp//在CPP资料里面定义,这样在链接的时候能够找到,
//而且不会发现不同CPP里面用的是不同的副本,编译速度会更快。可执行资料也应该更小。
int a = 0;

---华软网友回复---
引用 1 楼 wltg2001 的回复:
H资料在编译时会被直接插入到CPP资料中去的,你的a.h被包括了屡次,那么这个函数就相当于有多个实现,当然会重定义了。


很对啊
---华软网友回复---
引用 9 楼 hw_henry2008 的回复:
引用 7 楼 yiruirui0507 的回复:
#ifndef _MYSTACK_H
#define _MYSTACK_H

正解。
或用楼上的:#pragma once
防止二次包括。
尤其:如果你想把全局 变量放在头资料里,那就完全错了,而且出现的问题异常诡异!
千万不要把全局非静态变量放在头资料里。否则极可能发现2个cpp资料里面修改的变量互相不看来!
当然了,常量是……


++++
---华软网友回复---
#pragma once用了,没有效果
---华软网友回复---
mark,学习,貌似我有过类似毛病。9楼的用过,7楼的不知道
---华软网友回复---
引用 9 楼 hw_henry2008 的回复:
引用 7 楼 yiruirui0507 的回复:
#ifndef _MYSTACK_H
#define _MYSTACK_H

正解。
或用楼上的:#pragma once
防止二次包括。
尤其:如果你想把全局 变量放在头资料里,那就完全错了,而且出现的问题异常诡异!
千万不要把全局非静态变量放在头资料里。否则极可能发现2个cpp资料里面修改的变量互相不看来!
当然了,常量是没……

这样确实是能够,但在我的工程里就会多一个CPP资料。
由于不想太多的资料,所以想直接写在H里
---华软网友回复---
在H中定义的函数,别实现它,就是别写上{},就不会出现你这个问题了。出了问题,能够用上面的方法。

你也完全能够写在一个CPP中,然后在其它CPP想调用的时候,声明一下(extern),就好了。      
华软声明:本内容来自网络,如有侵犯您版权请来信指出,本站立即删除。