头文件的具体功用

头文件的具体作用
在网上看到这么一段话:
头文件并不参加链接和编译。编译器第一步要做的就是简单的把头文件在包含它的源文件中展开。不知你是否能理解这句话。也就是头文件里面有什么内容,通通把它移到包含这个头文件的源文件里。(我觉得这是个很重要的概念,可以帮助我们简化理解编译链接的过程,包括理解头文件中定义静态变量或静态函数是怎么回事)。编译器经过这一步转换后剩下什么呢?就是一堆cpp文件了。而头文件已经不再是编译器需要关心的东西了。编译器接下来就要处理这一堆cpp文件了。

那加了ifndef的头文件被多次引用的话,是不是该头文件对应的CPP文件只展开一次?还有就是那个展开具体是一个怎样的过程?
头文件

------解决方案--------------------
头文件是编译单元,cpp才是编译单元。 你说的那个条件编译宏只能放置同一个头文件在任意一个编译单元中重复包含,不能防止不同的编译单元各自包含同一个头文件。 所以那个条件编译宏不能解决链接时重复定义。
------解决方案--------------------
引用:
Quote: 引用:

头文件是编译单元,cpp才是编译单元。 你说的那个条件编译宏只能放置同一个头文件在任意一个编译单元中重复包含,不能防止不同的编译单元各自包含同一个头文件。 所以那个条件编译宏不能解决链接时重复定义。
我明白了,那个条件编译宏只能防止一个编译单元(一个源文件)重复引用该头文件,但是不能防止变量的二次定义
但是还有个问题,头文件中定义的变量容易出现重复定义,那为什么头文件中定义的类就很少有这种情况呢?

1.类的成员函数定义要放在头文件中,若是(隐式或显式)内联的,没有问题,可以放在头文件中。否则一样会有问题。
2. 而类定义并没有定义其(非静态的)数据成员,所以没有问题。
3. 类的静态数据成员一样可能有问题。
4. 模板类的定义是个例外。 

本质问题是:链接属性
------解决方案--------------------
头文件的具体功用
防止头文件重复被引用!
而且如果已经引用了该头文件,将不再引用该头文件的!
------解决方案--------------------
引用:
类的成员函数具体定义放在源文件中的吧?头文件里面只是声明吧?

数据成员显然是在那些类实例化的地方,也就是对象定义的地方。
------解决方案--------------------
引用:
Quote: 引用:

头文件的具体功用
防止头文件重复被引用!
而且如果已经引用了该头文件,将不再引用该头文件的!
这个好像只能防止被重复引用,不能防止变量重复定义…


头文件一般很少有定义的东西吧,除非一些内敛函数!
------解决方案--------------------
引用:
我也觉得啊,但是我不明白为什么头文件中一个单独的变量(比如 int a;)就是定义,而放在类里就不是,而是算声明呢?比如
class A{public:int a;};

是定义没有错,不过没有人来链接a,所以自然没有链接问题。
------解决方案--------------------
编译选项加/EP /P,重新编译,查看宏展开后对应的.i文件。gcc加-E
?