目录
程序结构
以声明结构、使用结构为例
- 头文件(struct.h):包含结构声明和使用这些结构的函数的原型(函数声明)。
- 源代码文件(struct.cpp):包含于结构有关的函数的代码。(#include"struct.h")
- 源代码文件(main.cpp):包含调用与结构相关的函数的代码。(#include"struct.h")
#include指令有什么作用?
#include是一条编译预处理命令。当编译器遇到了#include命令后,就把该命令中的文件插入到当前的文件中。
什么叫编译预处理命令呢?它是写给编译器的信息,而不是程序中需要执行的语句。编译预处理命令不仅仅只有#include一条,在C++中,所有以#开头的命令都是编译预处理命令,比如#if、#else、#endif、#ifdef、#ifndef、#undef和#define等。
.h头文件中应该放哪些东西
- 函数原型
- 使用#define或const定义的符号常量
- 结构声明
- 类声明
- 模板声明
- static,inline,extern修饰的函数
- extern导入外部变量
凡是在两个编译单元重复出现两次会出错的东西都不要放在.h中。
什么是重复包含头文件?
//文件text.cpp中有如下代码
#include "A.h"
#include "B.h"
//头文件B.h中又包含了A.h
#include "A.h"
注意:如果头文件A中没有定义变量或者函数定义(或者重复出现两次会出错的代码),编译这个文件时可能不会出错。比如头文件A中只有函数声明,而函数声明可以重复出现,那么编译会变慢但不会出错。
重复包含头文件会出现的问题
- 使预处理的速度变慢了,要处理很多本来不需要处理的头文件。
- 可能预处理器就陷入死循环了(其实编译器都会规定一个包含层数的上限)。例如C.h包含D.h,D.h又包含C.h的情况,如果不采用防止头文件的重复定义,那么预处理器就会进入死循环了。
- 头文件里有些代码不允许重复出现。而重复定义头文件会重复出现一些代码。(虽然变量和函数允许多次声明(只要不是多次定义就行),但头文件里有些代码是不允许多次出现的)。例如:使用typedef类型定义和结构体Tag定义等,在一个程序文件中只允许出现一次。
原文链接:https://blog.csdn.net/weixin_39303983/article/details/118670264
如何避免头文件重复包含
条件编译
#ifndef _Shy_code_H_
#define _Shy_code_H_.......... // 一些声明语句
#endif //_Shy_code_H_
#pragma once
#pragma once
... ... // 一些声明语句
两者比较
- #ifndef的方式依赖于宏名字不能冲突,这不光可以保证同一个文件不会被包含多次,也能保证内容完全相同的两个文件不会被不小心同时包含。当然,缺点就是如果不同头文件的宏名不小心“撞车”,可能就会导致头文件明明存在,编译器却硬说找不到声明的状况。
- #pragma once则由编译器提供保证:同一个文件不会被编译多次。注意这里所说的“同一个文件”是指物理上的一个文件,而不是指内容相同的两个文件。带来的好处是,你不必再费劲想个宏名了,当然也就不会出现宏名碰撞引发的奇怪问题。对应的缺点就是如果某个头文件有多份拷贝,本方法不能保证他们不被重复包含。当然,相比宏名碰撞引发的“找不到声明”的问题,重复包含更容易被发现并修正。
- 方式一由语言支持所以移植性好,方式二 可以避免名字冲突
- #pragma once方式产生于#ifndef之后,因此很多人可能甚至没有听说过。目前看来#ifndef更受到推崇。因为#ifndef受语言天生的支持,不受编译器的任何限制;而#pragma once方式却不受一些较老版本的编译器支持,换言之,它的兼容性不够好。也许,再过几年等旧的编译器死绝了,这就不是什么问题了。
- 原文链接:https://blog.csdn.net/weixin_39303983/article/details/118670264