防止头文件多次引入
来源:互联网 发布:淘宝如何自动发卡密 编辑:程序博客网 时间:2024/06/05 04:18
1.头文件被多次重复引用会造成的后果:
头文件多次重复引用:一个头文件被多次在源文件中多次引用。
先来看一段代码:
/*Test.h*/#include <stdio.h>int a = 10;
/*Test.c*/#include "Test.h"#include "Test.h"int main(){ printf("d o o\n"); return 0;}
显示结果:
出现了错误,由于多次引入同一头文件,导致变量重定义,这时,有些人就会说,谁会**到引入两次头文件,对哦,那么看下面这个例子:
/*Test.h*/#include <stdio.h>int a = 10;
/*Test.c*/#include "Test.h"int a = 20;int main(){ printf("a = %d\n", a); return 0;}
这个就很有可能写出来了,当然还是先看一下结果:
和上面那种情况一模一样..
总结:
当多次引用同一头文件时,会有可能出现变量重定义,导致代码在编译时出错。所以规范的代码应该避免这种情况的发生。
这是在知乎关于这个问题的讨论和大牛的一些观点-------知乎大牛
2.怎样避免发生这种错误
第一种方式:
#ifndef __TEST_H__#define __TEST_H__//your code#endif
采用条件编译的方式,当第一次引入TEST_H时,编译器会检测到TEST_H还没有被定义,那么就会执行下面的内容;当再次引入,就会检测到已经定义了TEST_H,那么此时就不会执行下面的内容,这种采用宏定义的处理,可以很有效的避免发生这种错误。
第二种方式:
#pragma once//your code
这是一种由编译器提供支持的方式,防止同一文件的二次编译,这里的同一文件指的是物理文件(实实在在存在的文件)。
两种方式的对比:
#ifndef的方式依赖于宏名字不能冲突,这不光可以保证同一个文件不会被包含多次,也能保证内容完全相同的两个文件不会被不小心同时包含。当然,缺点就是如果不同头文件的宏名不小心相同时,可能就会导致头文件明明存在,编译器却硬说找不到声明的状况。
#pragma once则由编译器提供保证:同一个文件不会被包含多次。注意这里所说的“同一个文件”是指物理上的一个文件,而不是指内容相同的两个文件。带来的好处是,你不必再费劲想个宏名了,当然也就不会出现宏名相同引发的奇怪问题。对应的缺点就是如果某个头文件有多份拷贝,此时就不能保证他们不被重复包含。当然,相比宏名相同引发的“找不到声明”的问题,重复包含更容易被发现并正。
方式一由语言支持所以移植性好,方式二 可以避免名字冲突。
本文出自 “Pzd流川枫” 博客,请务必保留此出处http://xujiafan.blog.51cto.com/10778767/1772380
- 防止头文件多次引入
- 防止头文件重复引入
- c++ 防止头文件多次编译方法
- 防止头文件被多次包含的处理方法
- 防止同一编译单位头文件多次include
- 防止头文件被多次编译的写法有两种
- 标准头文件的写法(防止多次添加同一头文件产生错误)
- C++学习的一些笔记-->2:防止头文件多次导入造成重复编译的方法
- js引入头文件
- 引入头文件
- 避免头文件多次编译
- 两种防止头文件重复引入的方法的区别
- C语言头文件引入
- c++引入mysql头文件
- 防止头文件重复包含
- 防止头文件重复引用
- 防止头文件二次编译
- 防止头文件重复编译
- 大牛Git教程
- 二叉树基础
- C++ 复杂链表的复制
- 结构体内存对齐
- 二分法查找元素位置
- 防止头文件多次引入
- 理解环境变量
- 部分find命令使用
- Eclipse + Python 的安装与配置流程
- Mysql读写分离,同步复制的探索实现
- Jenkins 权威指南(中文版) 第一章 Jenkins的介绍
- Android自定义控件实战——滚动选择器PickerView
- JSF对应的实体类一定要使用set和get方法
- poj 2010 优先队列~