下面我来详细讲解一下 "C++ 中#pragma once 与 #ifndef XXX_H #define XXX_H 的区别"。
1. #ifndef XXX_H #define XXX_H
为确保头文件只被编译一次,通常的做法是在头文件的开头使用宏定义指令,例如:
#ifndef _XXX_H_
#define _XXX_H_
// 内容
#endif
解释一下这段代码的含义:它使用了一对预定义宏 #ifndef
和 #define
来判断宏 _XXX_H_
是否已经被定义。如果没有定义,则说明是第一次包含该头文件,将宏 _XXX_H_
定义为真;否则,就说明该头文件已被包含过了,直接跳过,不再处理。
2. #pragma once
#pragma once
指令也是用来避免头文件被重复包含的,它的作用和 #ifndef
和 #define
的效果是一样的,只不过它更简单。
#pragma once
// 内容
不必像使用 #ifndef
和 #define
一样需要写两条指令才能达到同样的效果。只要在头文件开头写上 #pragma once
,编译器就会自动帮我们避免头文件的重复包含。在编译速度方面, #pragma once
相较于 #ifndef
和 #define
要略微快一些。
3. 区别
了解了两种常用的避免头文件重复包含的方式,我们再来看看它们的区别吧。
#ifndef
和#define
的方式是标准的 C/C++ 预处理器的写法,兼容性较好,可用于各种编译器,并且可以达到编译时最优化;#pragma once
属于编译器特有的扩展命令, 有些编译器并不支持。但使用#pragma once
会更简洁方便,无需写两个指令,与时俱进的编译器都能识别,所以更佳易用。
例子:
下面给出两例展示以上两种方式的用法,如下所示:
#ifndef 和 #define 的方式
#ifndef MYHEADER_H
#define MYHEADER_H
#include <iostream>
void foo()
{
std::cout << "Hello, world!" << std::endl;
}
#endif // MYHEADER_H
#pragma once 的方式
#pragma once
#include <iostream>
void foo()
{
std::cout << "Hello, world!" << std::endl;
}
以上是本题的完整攻略,希望对你有所帮助。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:C++ 中pragma once 与 #ifndef _XXX_H_ #define _XXX_H_的区别 - Python技术站