在用VC6.0向导生成的头文件中,经常可以看见如下的代码段:
#if !defined(AFX_RESIZABLELAYOUT_H__INCLUDED_)
#define AFX_RESIZABLELAYOUT_H__INCLUDED_
#if _MSC_VER > 1000
#pragma once
#endif // _MSC_VER > 1000
...
#endif // !defined(AFX_RESIZABLELAYOUT_H__INCLUDED_)
对于宏有基本了解的朋友应该都知道,头文件中如下的宏定义,是为了避免同样的头文件在同一个.C文件或者.CPP文件多次包含。
#if !defined(XXX)
#define XXX
#endif
这很好理解,但接下来的一段,尤其是#pragma once的意思,我就不是很清楚了。从MSDN得到pragma once的解释是:
"Specifies that the file will be included (opened) only once by thecompiler when compiling a source code file."
英文注释的大意也是说#pragma once是为了避免文件重复包含。疑惑就此产生了,既然宏"#if !defined"已经有这个作用了,为何还要一个"#pragma once"呢? 我接着在网上搜到了几份答案,但大家的回答都很模糊,于是我想放弃,不再想这个问题,但还是不太甘心,就接着看了看别人的解释。突然间,好像灵犀一点,开窍了。虽然"#if !define"和"#pragma once"都有避免重复包含的功能,但是在实现上还是有区别的。举一例如下:
// Test1.h
#if !define (__TESTONE_H_)
#define __TESTONE_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
...
头文件Test1.h中用宏来避免重复,头文件Test2.h中用#pragma once来避免重复。编译Test.cpp,将需要打开Test1.h两次,第一次发现宏__TESTONE_H_没有定义,接着就处理宏定义;第二次打开Test1.h时,发现宏__TESTONE_H_已经定义过了,编译器就会略过宏定义部分,知道处理完Test1.h末尾的#endif。
而由于头文件Test2.h使用#pragma once来避免重复定义的,在编译Test.cpp的过程中,Test2.h只会被打开一次,也就是处理到第3行的时候。因为Test2.h用的是#pragma once,所以在处理完第3行后,编译器已经知道包含了一次Test2.h,在它(编译器)处理第4行代码时,发现Test2.h已经包含过了,忽略掉第4行代码,也就不需要再次打开Test2.h进行判断了。
总结一下,除了#pragma once是微软编译器所特有的之外,用宏和#pragma once的办法来避免重复包含头文件,主要区别在于宏处理的方法会多次打开同一头文件,而#pragma once则不会重复打开,从而#pragma once能够更快速。
分享到:
相关推荐
### VC中的`#pragma`指令详解 在C/C++编程中,`#pragma`指令是一种预处理器指令,被广泛应用于Microsoft Visual C++(VC)编译器中,用于控制编译器的行为,如代码布局、警告信息管理、资源管理等。下面我们将详细...
这相当于使用传统的`#ifndef`、`#define`和`#endif`组合来避免重复包含问题,但在现代IDE中更受欢迎且易于阅读。 ```c++ #pragma once ``` 虽然在较旧的编译器版本中(如VC6)可能不被支持,但大多数现代编译器都...
Once 参数:避免头文件重复包含 `#pragma once` 是一个广为人知的指令,用于防止头文件在预编译过程中被多次包含。虽然 VC6 及更早版本的编译器已经支持该指令,但由于兼容性考虑,实际应用并不广泛。然而,随着...
`once` 参数是 `#pragma` 指令中最常用的一个参数,只要在头文件的最开始加入这条指令就能够保证头文件被编译一次。 ```c #pragma once ``` 这条指令实际上在 VC6 中就已经有了,但是考虑到兼容性并没有太多的使用它...
pragma once 指令只要在头文件的最开始加入这条指令就能够保证头文件被编译一次,这条指令实际上在 VC6 中就已经有了,但是考虑到兼容性并没有太多的使用它。 4. #pragma hdrstop pragma hdrstop 指令表示预编译...
这条指令实际上在VC6中就已经有了,但是考虑到兼容性并没有太多的使用它。 4. #Pragma hdrstop参数 #Pragma hdrstop参数表示预编译头文件到此为止,后面的头文件不进行预编译。BCB可以预编译头文件以加快链接的...
`once`参数用于确保头文件只被编译一次,避免多次包含带来的问题。这个特性在VC6中已经存在,但由于兼容性的考虑并未广泛使用。 ```c++ #pragma once ``` 在头文件的开始添加这条指令可以确保头文件仅被编译一次。 ...
在VC编译器中,`#pragma`指令是一种非常强大的预处理器指令,允许程序员以编译器特有的方式控制编译行为,而不会破坏C或C++语言的兼容性。 #### 二、`#pragma`指令详解 `#pragma`指令的一般格式为`#pragma Para`,...
例如,#pragma once 指令可以保证头文件被编译一次,避免重复编译。 源代码版本控制 在多平台开发中,预编译指令和宏定义可以帮助我们控制源代码的版本。 例如,假设我们为 WINDOWS 和 LINUX 开发了一套软件,...
### VC中创建DLL详解 #### 一、概述 在Visual C++ (VC) 开发环境中创建动态链接库(Dynamic Link Library, DLL)是一项常见的任务,尤其是当需要在多个应用程序之间共享代码时。本文将详细介绍如何在VC中创建DLL,...
这样做的好处在于可以避免重复编写相同的代码,同时也可以使得多个文件共享相同的数据类型定义,从而保持代码的一致性和可读性。 #### 2. `#define` 宏定义 `#define` 用于定义宏,它可以是简单的文本替换,也可以...
它确保头文件在整个项目中只被编译一次,避免重复定义的问题。虽然在VC6中就已经存在,但由于兼容性问题,其使用并不广泛。然而,随着现代编译器的支持增强,#pragma once已成为一种标准实践。 4. **#pragma ...
- **C++编译器专有编译指示**:这些指令只适用于C++编译器,如 #pragma once(确保文件只被包含一次)。 - **C和C++编译器编译指示**:这些指令同时适用于C和C++编译器,如 #pragma pack (n)(设置结构体成员对齐...
添加包含要导出的全局变量,函数和类的头文件MathLib.h: 代码如下: //MathLib.h #pragma once #ifdef MATHLIB_EXPORT #define MATHLIBAPI __declspec(dllexport) #else #define MATHLIBAPI __declspec...
例如,当需要确认某些宏是否已定义时,可以使用`#ifdef`配合`#Pragma message`来检查,如果宏被定义,编译时会输出相应的提示信息。 2. **`#Pragma code_seg`**: 这个指令用于指定函数代码存储在哪个内存段,这...
#pragma once #include #include "resource.h" class CDisplayView : public CFormView { DECLARE_DYNCREATE(CDisplayView) protected: CDisplayView(); public: virtual ~CDisplayView(); enum { IDD = ...
源码#pragma once #endif // _MSC_VER > 1000 const int N=10000; class CRandDrawView : public CView { protected: // create from serialization only CRandDrawView(); DECLARE_DYNCREATE(CRandDrawView) /...
#pragma once #endif // _MSC_VER >= 1000 // Return values #ifndef BTNST_OK #define BTNST_OK 0 #endif #ifndef BTNST_INVALIDRESOURCE #define BTNST_INVALIDRESOURCE 1 #endif #ifndef BTNST_FAILEDMASK #...
Visual C++中有一种简化的方法,那就是使用#pragma once。 跨平台编译 C/C++语言宏定义还可以用来实现跨平台的编译。不同的操作系统和编译器都有其特定的宏定义,可以根据不同的宏定义来编译不同的代码。例如: ...