#ifndef... #define与#pragma once总结
2015-08-21 23:13
239 查看
前几天看到同一个项目中有的地方使用了#ifndef...#define ...#endif,而有的地方却用了#pragma once,于是我就纠结了,这两者有神马区别呢?今天仔细查了一下,发现还是有一点点的区别,不过不大,简单记录一下。
#ifndef ...#define ...#endif和#pragma once都是为了解决同一个问题的,就是防止头文件被重复包含和编译。这种宏定义都是作用于编译阶段,属于条件编译,控制编译流,可以让我们按照想要的方式来编译我们的代码。
//includetest头文件
优点如下:
1.原生支持,适合跨平台。这种方法是语言本身支持的,在所有C++编译器上都可以支持。所以,如果是跨平台方式,最好使用这种方式,比较保险。
2.可以保证内容相同的而名字不同的文件不被包含,虽然这种情况比较少,但是还是有可能的。即两个文件虽然名字不同,但是内容完全相同,这时候,就通过#ifndef区别出来,保证这种情况不会被重复编译。
缺点如下:
1.比较麻烦...好大一串,而且,这个#ifndef ...后面的宏名字还需要自己定义,一般就是文件名的大写。
2.自己定义#ifndef后面的宏名字,虽然可以保证内容相同的文件不被重复包含,但是,如果两个文件的宏名字相同了,就有可能导致一个文件被包含了,另一个不被包含,进而导致明明声明了函数,却找不到的情况。
//includetest头文件:
优点如下:
1.简单粗暴,一句搞定。而且不需要上面那种情况,需要绞尽脑汁的想一个尽可能长长的宏名字。
2.不用自己起宏名字,就可以避免上面那种可能有宏名字冲突的情况。
缺点如下:
1.这个是微软发明的东东,所以不是普适性的。有些老的编译器还不支持这条特性,虽然现在这条已经基本被各种编译器支持了,不过,保险的话,跨平台的还是用上一种。
2.不能保证内容相同但名字不同的文件被重复包含。
其实,这两者的优缺点是互补的,我们可以视情况而定,到底用哪一种。最好是使用同一种。本人以前还干过两个一起用的蠢事....
一.简介
#ifndef ...#define ...#endif和#pragma once都是为了解决同一个问题的,就是防止头文件被重复包含和编译。这种宏定义都是作用于编译阶段,属于条件编译,控制编译流,可以让我们按照想要的方式来编译我们的代码。二.#ifndef ...#define ...#endif
这个方法是最早期的使用方法,其实就是字面的理解,ifndef 是if not define的缩写,就是如果没有包含这个文件,那么包含这个文件,而如果包含了这个文件,那么在编译的时候,宏定义的条件不成立,就会跳过这个#define和#endif之间的内容。达到防止重复包含的作用。//includetest头文件
#ifndef __INCLUDETEST_H_ #define __INCLUDETEST_H_ void TestFunc(); #endif这样,如果有两个文件,都包含了TestFunc头文件,第一个如果被包含了,那么在下一次遇到#ifndef __INCLUDETEST_H_时,这个条件为假,下面的就不会再包含。
优点如下:
1.原生支持,适合跨平台。这种方法是语言本身支持的,在所有C++编译器上都可以支持。所以,如果是跨平台方式,最好使用这种方式,比较保险。
2.可以保证内容相同的而名字不同的文件不被包含,虽然这种情况比较少,但是还是有可能的。即两个文件虽然名字不同,但是内容完全相同,这时候,就通过#ifndef区别出来,保证这种情况不会被重复编译。
缺点如下:
1.比较麻烦...好大一串,而且,这个#ifndef ...后面的宏名字还需要自己定义,一般就是文件名的大写。
2.自己定义#ifndef后面的宏名字,虽然可以保证内容相同的文件不被重复包含,但是,如果两个文件的宏名字相同了,就有可能导致一个文件被包含了,另一个不被包含,进而导致明明声明了函数,却找不到的情况。
三.#pragma once
这个倒是灰常精简,就一句话。这种是由编译器提供编译的保证。只需要在头文件头添加这句话,就可以保证这个文件不被重复包含了。//includetest头文件:
#pragma once void TestFunc();
优点如下:
1.简单粗暴,一句搞定。而且不需要上面那种情况,需要绞尽脑汁的想一个尽可能长长的宏名字。
2.不用自己起宏名字,就可以避免上面那种可能有宏名字冲突的情况。
缺点如下:
1.这个是微软发明的东东,所以不是普适性的。有些老的编译器还不支持这条特性,虽然现在这条已经基本被各种编译器支持了,不过,保险的话,跨平台的还是用上一种。
2.不能保证内容相同但名字不同的文件被重复包含。
其实,这两者的优缺点是互补的,我们可以视情况而定,到底用哪一种。最好是使用同一种。本人以前还干过两个一起用的蠢事....
相关文章推荐
- hdu1018 Big Number
- 同一个变量打印char类型和unsigned char 类型,引发的思考
- memcpy 和 memmove 函数
- CAS服务端取消https验证
- redis cluster 集群重启关闭
- 自定义控件(五)禁止滑动的ViewPager
- 新手必须知道的13个Xcode小技巧
- 鸟哥的Linux私房菜-----14、磁盘配额
- 《花千骨》为何被批“脑残”还能创造收视神话?
- 堆区和栈区的区别
- 【LeetCode】(172)Factorial Trailing Zeroes(Easy)
- grub修复
- PAT 1010 月饼
- 多线程在python中的使用 thread
- HttpURLConnection和HttpClient
- 欢迎使用CSDN-markdown编辑器
- 马上开学了
- 谈谈 OC 中的内联函数
- 杀毒与免杀技术详解之二:特征码定位-工具及原理
- dp+trie nbut1222 English Game