C++中头文件一般包含哪些东西?

头文件和源文件

由于头文件是为了重用,所以在一个复杂的程序中,头文件可能会被间接地重复包含。如果头文件里面都是函数声明,那问题还不大。如果头文件里面有函数定义(如程序11.2),那么就会出现函数被重复定义的错误,程序将无法运行。我们可以采用函数声明和定义分离的方式:把所有的声明都放在shape.h中,把所有的定义放在shape.cpp中。注意必须在shape.cpp中包含shape.h,否则在编译连接时会发生错误。我们在使用时仍然包含shape.h,但由于函数的定义并不在该头文件中,所以就不会被重复定义了。

细说#include

我们几乎每次编写程序的时候都要用到#include命令,那么这条命令到底是什么意思呢?

#include是一条编译预处理命令。什么叫编译预处理命令呢?我们知道,程序中的每一句语句会在运行的时候能得到体现。比如变量或函数的声明会创建一个变量或者函数,输出语句会在屏幕上输出字符。然而编译预处理命令却不会在运行时体现出来,因为它是写给编译器的信息,而不是程序中需要执行的语句。编译预处理命令不仅仅只有#include一条,在C++中,所有以#开头的命令都是编译预处理命令,比如#if、#else、#endif、#ifdef、#ifndef、#undef和#define等等。

当编译器遇到了#include命令后,就把该命令中的文件插入到当前的文件中。不难想象,程序11.2的main.cpp文件实质上包含了shape.h文件中的所有语句。所以它能够顺利调用shape.h文件中的各个函数。

来源:http://c.biancheng.net/cpp/biancheng/view/65.html



问题: h头文件还有c文件中该放些什么东西?
描述:

以前我都是在.h头文件中定义函数,然后把.h文件include到main()所在的.c文件,在mian()函数中调用.h中的函数。
最近有朋友告诉我不能这么做,应该把函数声明写在.h中,另外建个.c文件定义具体的函数操作,再把.h文件include到main()所在的.c文件,调用即可。
不知这个问题怎么处理才好?



解决方案1:

函数声明写在.h中,另外建个.c文件定义具体的函数操作,再把.h文件include到main()所在的.c文件

解决方案2:

最近有朋友告诉我不能这么做,应该把函数声明写在.h中,另外建个.c文件定义具体的函数操作,再把.h文件include到main()所在的.c文件,调用即可。 
一般是在.h里声明,在对应名字的.cpp里写接口跟功能,(模板除外),然后其他.cppx需要调用就包含头文件就可以了.

解决方案3:

一个好习惯,除了static,inline,extern函数,正常的函数不要在.h里实现,只是把申明放在h里,实现放在。c里。

解决方案4:

一般推荐头文件用于放声明,源文件用于定义和实现,但是有些定义也可以放在头文件中。

引用楼主 zhouzb889 的帖子:

以前我都是在.h头文件中定义函数,然后把.h文件include到main()所在的.c文件,在mian()函数中调用.h中的函数。 
最近有朋友告诉我不能这么做,应该把函数声明写在.h中,另外建个.c文件定义具体的函数操作,再把.h文件include到main()所在的.c文件,调用即可。 
不知这个问题怎么处理才好?

解决方案5:

你的朋友是对的。
这个问题的关键在于你的方法是适合在小的工程中,不会有多次包含头文件的情况,或者很容易避免这样的情况,如果项目的代码比较多的时候,
你的方法就会有比较大的问题。
会出现多个文件同时包含一个。h文件,然后编译的过程就出现重定义,然后你只好吭哧吭哧该代码吧。。。

解决方案6:

可以包含宏定义、类定义、结构体定义、模板定义、全局变量声明,函数声明、内联函数定义等。
不要包含全局变量定义,函数定义。
以上的例子可能列举得还不全。
其实从本质上讲,只需要明白一件事:头文件是用来被别人包含的,因此同一个头文件极有可能被两个以上的cpp文件所包含(比如<iostream>就常被多个cpp文件包含)。因此凡是在两个编译单元重复出现两次会出错的东西都不要放在.h中。

链接:http://www.codes51.com/itwd/2908358.html



C++中头文件一般包含哪些东西?

时间: 2024-08-28 12:50:27

C++中头文件一般包含哪些东西?的相关文章

C程序中头文件相互包含精华(转载)

C程序中头文件相互包含精华(网摘小结) 收藏(转自:http://blog.csdn.net/lingyun3429/archive/2010/04/27/5535191.aspx).h中一般放的是同名.c文件中定义的变量.数组.函数的声明,需要让.c外部使用的声明. 1)h文件作用 1 方便开发:包含一些文件需要的共同的常量,结构,类型定义,函数,变量申明: 2 提供接口:对一个软件包来说可以提供一个给外界的接口(例如: stdio.h). 2)h文件里应该有什么 常量,结构,类型定义,函数,

C/C++ 中头文件相互包含引发的问题

今天下午遇到一个头文件相互包含而导致的编译问题,花了我不少时间去调试没找到问题,最后晚上跟师兄讨论不少时间,突然有所顿悟! 问题重现 我把问题脱离于项目简单描述一下:我写了一个函数 bool func(ClassA* CA) 需要加到项目中,我就把这个函数的声明放到 head1.h 中,函数参数类型 ClassA 定义在另一个头文件 head2.h 中,因此我需要在 head1.h 中包含 head2.h:而 head2.h 中之前又包含了 head1.h,这样就构成了一种头文件相互包含的场景.

C++头文件的包含顺序研究

C++头文件的包含顺序研究 作者:朱金灿 来源:http://www.cnblogs.com/clever101 一.<Google C++ 编程风格指南>里的观点 最近公司在推行编码规范,领导提议基本上使用<Google C++ 编程风格指南>.其中<Google C++ 编程风格指南>对于头文件的包含顺序是这样的: Names and Order of Includes link ▽Use standard order for readability and to

C++中头文件与源文件的作用详解

一.C++ 编译模式 通常,在一个 C++ 程序中,只包含两类文件―― .cpp 文件和 .h 文件.其中,.cpp 文件被称作 C++ 源文件,里面放的都是 C++ 的源代码:而 .h 文件则被称作 C++ 头文件,里面放的也是 C++ 的源代码. C++ 语言支持"分别编译"(separatecompilation).也就是说,一个程序所有的内容,可以分成不同的部分分别放在不同的 .cpp 文件里..cpp 文件里的东西都是相对独立的,在编译(compile)时不需要与其他文件互通

C/C++函数重复定义、头文件重复包含、互相包含问题

1.避免头文件重复包含 // test.h 此段宏的意思是如果定义了宏变量TEST_H_则不再定义它 #ifndef TEST_H_ #define TEST_H_ //头文件内容 #endif 或者 // test.h 告诉预编译器只包含一次 #pragma once 2.避免重复定义 不要将函数定义放置在头文件里面,正确的做法是头文件放置函数声明,源文件放置函数定义.因为源文件是分别编译的,假如头文件放置了函数定义,包含该头文件的每一个源文件都会定义相应的函数,从而导致重复定义.但是几种情况

Makefile中头文件在依赖关系中作用

摘于:http://bbs.csdn.net/topics/120024677 (1)在makefile的依赖关系中用不用体现.h头文件?(2)如果在依赖关系中要体现.h头文件,应该体现到什么层次?==============================(1)在makefile的依赖关系中用不用体现.h头文件?============================== 下面是我的一些认识: 头文件中定义的是接口(函数接口,文件外全局变量和宏定义),它的作用是向调用文件封装函数的实现过程.在

C++ 头文件相互包含的问题

今天在看C++ Primer第7章,一个习题是要写两个类,一个是Screen类,一个Window_mgr类,其中,Window_mgr类包含有一个vector<Screen>类型的成员 和一个clear函数,用于操作Screen类,所以需要把clear函数声明为Screen类的友元函数,这样就需要在定义Screen类的头文件中包含Window_mgr类的头文件,同理也需要在Window_mgr类中包含Screen类的头文件,如下: Screen.h #ifndef SCREEN_H #defi

C++ 头文件重复包含解决之道

我们在C/C++编程中,经常出现这种类型的错误:error: redefinition of 'struct student'或者error: previous definition of 'struct student'. 字面来看,指的是重新定义或者先前已定义.下面我将针对这一类型问题给出一套系统的解决方案,看了以下文章后,相信以后对于这种问题将会胸有成竹,对于程序的设计也更加合理. 开门见山,我讲给出一个具体的例子. 1.实例 struct.h struct student { char

c中头文件在cpp文件中引用和.h文件引用的思考

我们在编写程序中头文件是经常使用的.但是头文件是应该包含在.H文件中还是在.cpp文件中.在这个当中有什么样去区别呢.  假如说我们编写了一个a.cpp  .我们将a.cpp文件的变量和函数申明在a.h中.在a.h文件有使用了b.中定义的类型type1数据m_type,同样b.cpp的头文件一些变量也声明在b.h中.此时我们当然可以在a.cpp中包含b.h 也可以在a.h中.这样都是可行的,因为我们编译的时候会会将b.h包含进来.而.h文件是不参与编译的.然后我们继续深入.假如我们将b.h文件定