C语言 define 防止头文件重复包含 - C语言零基础入门教程
时间:2021-09-04
本文章向大家介绍C语言 define 防止头文件重复包含 - C语言零基础入门教程,主要包括C语言 define 防止头文件重复包含 - C语言零基础入门教程使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
目录
零基础 C/C++ 学习路线推荐 : C/C++ 学习目录 >> C 语言基础入门
一.头文件重复包含编译器报错
1.简单的理解头文件重复包
假如头文件里有一行
int a=1;
包含两次就变成了
int a=1;
int a=1;
2.老流氓的理解头文件重复包
你用过的套套肯定不会翻过来再用一遍;
二.通过宏定义解决头文件重复包含
1.通过 #ifndef / #define 解决头文件重复包含
#ifndef __XXX_H__
#define __XXX_H__
int a=1;
#endif
上面的伪代码如下:
如果(没有定义宏__XXX_H__)
{
那么直接定义宏__XXX_H__
定义变量a 并且赋值为 1
}
结束程序
- 假如第一次包含时,由于没有定义宏 __XXX_H,所以做了两件事,定义宏 __XXX_H,然后定义 int a = 1;
- 假如第二次包含时,由于已经定义宏 __XXX_H__,所以啥都不做;
- 假如第 N 次包含时,由于已经定义宏 __XXX_H__,所以啥都不做;
- 整个过程,无论头文件被包含多少次,变量 a 只被定义一次,不会有重复包含重复定义的问题存在!
2.通过 #pragma once 解决头文件重复包含
pragmaonce 是上述方式的简写,好处是再也不会有两个头文件因为使用了同样的 __XXX_H__ 而被忽略了
#pragmaonce
... ... // 声明、定义语句
三.通过插件 Visual Assist 设置快捷键解决文件重复包含
虽然上面两种方式都能解决 C/C++ 头文件重复包含冲突问题,但是还有一种更快捷的方法,直接通过 Visual Assist 设置快捷键完成,操作步骤如下:
1.安装插件 Visual Assist
详细的安装流程请参考:安装 Visual Studio 插件 Visual Assist
2.打开 VS,找到 VAssistX 选项
选择顶部菜单 VAssistX -> Code Generation and Refactoring -> Edit Refactoring Snippets
3.设置模板内容
选择 Type –> All by shortcut,新建一个快捷方式:** //t ** (快捷键:仅供参考,怎么顺手怎么来)
头文件模板内容如下:
#ifndef __$FILE_BASE_UPPER$_H__ //表示根据文件名字定义宏
#define __$FILE_BASE_UPPER$_H__
$end$
#endif //__$FILE_BASE_UPPER$_H__
4.点击 OK,设置完成
5.快捷键测试
打开 vs,创建任意工程,添加头文件,使用快捷键 //t,例如,我项目添加了一个 test.h 文件,然后使用快捷键 //t,如下:
#ifndef __TEST_H__
#define __TEST_H__
#endif //__TEST_H__
推荐使用方法三,因为 Visual Assist 设置快捷键操作起来更方便快捷, Visual Assist 插件不仅能解决头文件重复包含问题,还能通过快捷键设置文件版权信息和作者信息,参考文章:Visual Studio 设置文件版权信息
四.猜你喜欢
- C 语言 数组下标越界和内存溢出区别
- C 语言 指针声明和定义
- C 语言 指针 p++ / p–
- C 语言 p++/§++/_(p++)/_p++
- C 语言 使用指针遍历数组
- C 语言 指针和数组区别
- C 语言 指针数组和数组指针区别
- C 语言 空指针 NULL
- C 语言 void 指针
- C 语言 野指针
- C 语言 函数值传递和址传递
- C 语言 函数缺省参数
- C 语言 函数不定长参数
- C 语言 函数指针
- C 语言 指针函数
- C 语言 回调函数 callback
- C 语言 typedef
- C 语言 define 定义常量
- C 语言 define 防止头文件重复包含
未经允许不得转载:猿说编程 » C 语言 define 防止头文件重复包含
本文由博客 - 猿说编程 猿说编程 发布!
原文地址:https://www.cnblogs.com/shuopython/p/15225817.html
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- JAVA中的单例模式分析(doublecheck和枚举实现)
- 有关JAVA自动装箱-拆箱的分析
- 10 Confluent_Kafka权威指南 第十章:监控kafka
- 解决elasticsearch“Too many open files in system”问题
- elk基于jolokia监控springboot应用jvm方案
- elasticsearch集群更换节点操作
- 对storm1.2.3并行度的理解
- RabbitMQ集群搭建过程
- java中的reference(一): GC与4种基本的Reference(强软弱虚)
- java中的reference(三): FinalReference和Finalizer的源码分析
- 【ceph】性能测试工具cosbench(1)
- linux命令tree的使用
- 腾讯云V3签名方法之iOS
- Go语言学习之 panic 和 recover
- Go语言学习之函数