头文件保护 #pragma once与#ifndef 的区别
2016-09-04 11:47
1801 查看
#ifndef这种是最早期使用的方法,是基于语言的宏定义名字不能冲突的前提下的。这种方法不仅能保证同一个头文件不会被包含两次,也可以保证内容完全相同的两个文件也只能被包含一次。但是他优缺点,就是你的#ifndef 后面跟的宏名字和你程序中的其他宏名字发生了”撞车“,那么会出现以下两种后果
#ifndef,#define,#endif这个是C++语言相关,这是C++语言中的宏定义,通过宏定义避免文件多次编译。所以在所有支持C++语言的编译器上都是有效的,如果写的程序要跨平台,最好使用这种方式。
现在又有一个文件 book.h 里面使用了宏定义方式防止头文件二次编译
下面是你的主函数所在文件内容
预编译阶段把file1文件展开,就得到了宏 BOOK_H,在处理book.h文件时就发现BOOK_H这个宏已经存在了,就不会包含book.h头文件了,这就是弊端所在了。
#pragma once这种方式,是微软编译器独有的,也是后来才有的,所以知道的人并不是很多,用的人也不是很多,因为他不支持跨平台。如果你想写跨平台的代码,最好使用上一种。这是一种由编译器提供支持的方式,防止同一文件的二次编译,这里的同一文件指的是物理文件。
他也是有弊端的:
假如你的某一个头文件有多份拷贝,那么这些文件虽然在逻辑上都是一样的,但是在物理上他们却是不同的,所以当你把这些文件包含的时候,就会发现真的都包含进来了,然后就是编译错误了。还有,当物理上的同一文件被嵌套包含的时候,使用第一种方法预处理会每一次打开该文件做判断的,但是第二种方法则不会,所以在此#pragma once 会更快些。下面举例说明
预处理器在执行这四句的时候,先打开Test1.h然后发现里面的宏TEST1_H没有被定义,所以会包含这个文件,第二句的时候,同样还是会打开Test1.h的发现宏已定义,就不包含该文件按了。第三句时,发现之前没有包含Test2,h则会把该文件包含进来,执行第四句的时候,发现该文件已经被包含了,所以不用打开就直接跳过了。
主要区别
#pragma once是编译相关,就是说这个编译系统上能用,但在其他编译系统不一定可以,也就是说移植性差,不过现在基本上已经是每个编译器都有这个定义了;#ifndef,#define,#endif这个是C++语言相关,这是C++语言中的宏定义,通过宏定义避免文件多次编译。所以在所有支持C++语言的编译器上都是有效的,如果写的程序要跨平台,最好使用这种方式。
第一种:
file1头文件中有一个宏//file1.h #define BOOK_H //宏名
现在又有一个文件 book.h 里面使用了宏定义方式防止头文件二次编译
#ifndef BOOK_H #define BOOK_H // program #endif
下面是你的主函数所在文件内容
#include"fil1.h" #include"book.h" //这两个都是你自己的头文件 #include<........>
预编译阶段把file1文件展开,就得到了宏 BOOK_H,在处理book.h文件时就发现BOOK_H这个宏已经存在了,就不会包含book.h头文件了,这就是弊端所在了。
第二种就是:
两者顺序反过来了,弊端类似。#pragma once这种方式,是微软编译器独有的,也是后来才有的,所以知道的人并不是很多,用的人也不是很多,因为他不支持跨平台。如果你想写跨平台的代码,最好使用上一种。这是一种由编译器提供支持的方式,防止同一文件的二次编译,这里的同一文件指的是物理文件。
他也是有弊端的:
假如你的某一个头文件有多份拷贝,那么这些文件虽然在逻辑上都是一样的,但是在物理上他们却是不同的,所以当你把这些文件包含的时候,就会发现真的都包含进来了,然后就是编译错误了。还有,当物理上的同一文件被嵌套包含的时候,使用第一种方法预处理会每一次打开该文件做判断的,但是第二种方法则不会,所以在此#pragma once 会更快些。下面举例说明
// Test1.h #ifndefine TEST1_H #defineTEST1_H ... #endif // Test2.h #pragma once ... // Test.cpp #include "Test1.h" // line 1 #include "Test1.h" // line 2 #include "Test2.h" // line 3 #include "Test2.h" // line 4 这里的Test2.h是同一物理文件
预处理器在执行这四句的时候,先打开Test1.h然后发现里面的宏TEST1_H没有被定义,所以会包含这个文件,第二句的时候,同样还是会打开Test1.h的发现宏已定义,就不包含该文件按了。第三句时,发现之前没有包含Test2,h则会把该文件包含进来,执行第四句的时候,发现该文件已经被包含了,所以不用打开就直接跳过了。
参考阅读
http://blog.csdn.net/luoweifu/article/details/42550955相关文章推荐
- #pragma once与 #ifndef的区别为了避免同一个文件被include多次
- 关于使用#pragma once与#ifndef ___FILE_NAME__H避免文件被多次包含的区别
- #pragma once与#ifndef两种防止头文件二次编译的区别
- c++ 避免头文件重复引用 (pragma once与 #ifndef的区别)【转】
- 避免头文件复用-#pragma once与#ifndef的区别
- C++ 防止头文件被重复包含(#pragma once 与 #ifndef 的区别)
- c++ 避免头文件重复引用 (pragma once与 #ifndef的区别)
- #pragma once与#ifndef两种防止头文件二次编译的区别
- #pragma once与#ifndef两种防止头文件二次编译的区别
- #pragma once与#ifndef两种防止头文件二次编译的区别
- #pragma once与 #ifndef的区别
- #pragma once与 #ifndef的区别
- #pragma once与 #ifndef的区别
- 【转】#pragma once与 #ifndef的区别
- #ifndef和 #pragma once 区别
- #pragma once 与 #ifndef 的区别解析
- #ifndef与#pragma once的区别
- #pragma once 与 #ifndef 的区别解析
- #pragma once与 #ifndef的区别
- 头文件保护符和#pragma once