C/C++头文件的使用和问题汇总

文章介绍了#include指令的作用,头文件应包含的内容,重复包含头文件的问题以及如何避免这些问题。条件编译如#ifndef和#pragmaonce被讨论,两者的优缺点也进行了比较。
摘要由CSDN通过智能技术生成

目录

程序结构

#include指令有什么作用?

.h头文件中应该放哪些东西

什么是重复包含头文件?

重复包含头文件会出现的问题

如何避免头文件重复包含

条件编译

#pragma once

两者比较

程序结构

以声明结构、使用结构为例

  • 头文件(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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值