|
|
|
|
| 我居然被这样的问题难住了?再问include的问题 |
 我居然被这样的问题难住了?再问include的问题 - 春风吹又生 [ 2005-05-19 22:10 | 1,736 byte(s)]
 Re: 我居然被这样的问题难住了?再问include的问题 - KGB [ 2005-05-31 10:34 | 111 byte(s)]
 Re: 我居然被这样的问题难住了?再问include的问题 - smallfz [ 2005-06-05 16:46 | 127 byte(s)]
 Re: 我居然被这样的问题难住了?再问include的问题 - 春风吹又生 [ 2005-05-20 16:57 | 300 byte(s)]
 Re: 我居然被这样的问题难住了?再问include的问题 - chong2 [ 2005-05-31 09:12 | 809 byte(s)]
 Re: 我居然被这样的问题难住了?再问include的问题 - beatit [ 2005-05-20 17:24 | 76 byte(s)]
 Re: 我居然被这样的问题难住了?再问include的问题 - z_york [ 2005-05-19 23:59 | 218 byte(s)]
 Re: 我居然被这样的问题难住了?再问include的问题 - beatit [ 2005-05-19 23:14 | 252 byte(s)]
|
|
|
|
[Original]
[Print]
[Top]
|
一波未平,一波又起!
如果是类呢怎么办?
也是出重复定义!
------------------------F.h--------------------------------
#ifndef _F_H_
#define _F_H_
#include <iostream>
using namespace std;
.....
static int a= 1,b = 2,c =3;
extern void f1();
extern void f2();
class obj
{
public:
obj();
~obj();
int Area();
float Volume();
private:
float S,V;
};
obj obj1;
int obj::Area()
{
S = 2*a+2*b+2*c;
return S;
}
float obj::Volume()
{
V = a*b*c;
return V;
}
#endif
-----------------------------------------------
================f1.cpp=====================
#include "F.h"
#include "F.h"
void f1()
{
cout << obj1.Area() << endl;
}
---------------------------------
==============f2.cpp=================
#include "F.h"
void f2()
{
cout << obj1.Volume() << endl;
------------------------------------
==================main.cpp======
#include "F.h"
int main()
{
f1();
f2();
cout << a << b << c << endl;
return 0;
}
|
|
|
[Original]
[Print]
[Top]
|
|
[Original]
[Print]
[Top]
|
why do you ask the same question twice?
replace
#include "F.h"
with the content of F.h
and remove the macro _F_H_ because after preprocess, they are expanded.
see what you have.
|
|
|
[Original]
[Print]
[Top]
|
|
[Original]
[Print]
[Top]
|
大哥,你把声明一个变量obj obj1放在h文件中本身就是入门级的错误,没有什么好说的。
你应该在h文件里面:
extern obj obj1;
在另外一个XX.cpp文件中:
obj obj1;
|
|
|
----
I love David Beckham and Man.Utd. for ever.
|
|
[Original]
[Print]
[Top]
|
|
[Original]
[Print]
[Top]
|
其实我想弄明白的是,为什么#ifndef一点用处都没有??
我是这样想的,第一个处理的文件包含之后_F_H_定义之后,在下一个文件中#ifndef会作出判断,不会再次包含下面的内容,所以才在.h里面定义obj obj的!
这些细节问题在书里面学不到吧?谁再给解释一下??
无论如何,谢谢各位啦!
|
|
|
[Original]
[Print]
[Top]
|
|
[Original]
[Print]
[Top]
|
哈哈,这个问题看似简单,其实不简单!
首先你要弄明白h文件和c文件的关系。h文件是附属的,只有c文件才是一个编译的对象。(没见过编译h文件的,是吧?)。
每次编译一个c文件,都要把包含的h文件扩展进去。这和你直接把h文件的内容写进c文件没有区别。
这样你就看到了,如果你的h文件里有:obj obj1, 那么包含它的每个c文件里都有。最后链接的时候,链接器怎么能允许多个同名的对象同时存在????
再回到你的问题:“第一个处理的文件包含之后_F_H_定义之后,在下一个文件中#ifndef会作出判断,不会再次包含下面的内容”。这个技巧只是用来防止一个c文件包含一个h文件多次。(可以设想一下你的F.h包含了G.h,而G.h不小心又包含了F.h)。但是无法阻止其它c文件对这个h文件的包含。因为编译的对象是c文件,对每一个c文件的编译都是一个独立的过程!!!!
|
|
|
[Original]
[Print]
[Top]
|
|
[Original]
[Print]
[Top]
|
|
建议楼主读读<<Large-Scale C++ Software Design>>里面,关于内部符号和外部符号的内容。
|
|
----
非淡泊无以明志 非宁静无以致远
|
|
[Original]
[Print]
[Top]
|
|
|