今年招的本科生都在实习, 最近他们在准备毕业论文, 论文用C++, 于是其中有位牛人(确实很牛, 今天上午他刚查完日语能力考的成绩, 1级过了, 恭喜一下~)问了我这个问题:#pragma once与 #ifndef的区别
以前还真没注意pragma,他是编译指示, 从pragmatic来的?
他们都是用来防止同一个文件被include了多次, 调查了一下整理如下:
#ifndef方式:
#ifndef __SOMEFILE_H__
#define __SOMEFILE_H__ 1
... ... // 一些声明语句
#endif
#ifndef的方式依赖于宏名字不能冲突,这不光可以保证同一个文件不会被包含多次,也能保证内容完全相同的两个文件不会被不小心同时包含。当然,缺点就是如果不同头文件的宏名不小心“撞车”,可能就会导致头文件明明存在,编译器却硬说找不到声明的状况
#pragma方式
#pragma once
... ... // 一些声明语句
#pragma
once则由编译器提供保证:同一个文件不会被包含多次。注意这里所说的“同一个文件”是指物理上的一个文件,而不是指内容相同的两个文件。带来的好处
是,你不必再费劲想个宏名了,当然也就不会出现宏名碰撞引发的奇怪问题。对应的缺点就是如果某个头文件有多份拷贝,本方法不能保证他们不被重复包含。当
然,相比宏名碰撞引发的“找不到声明”的问题,重复包含更容易被发现并修正。
总结:
1. #ifndef 由语言支持所以移植性好,#pragma 可以避免名字冲突
2. 调查一下<stdlib.h>和<iostream>等标准库, 用得都是#ifndef, 我个人推荐这种方式.
分享到:
相关推荐
一般情况下,我们都是把函数声明、类定义、模板定义等写到一个头文件里,需要时将相应的头文件用#include包含到源文件(*.cpp文件)里来。但头文件中又允许包含其它的头文件,这样就难免发生某个头文件被重复地包含...
2 #pragma once方式 在能够支持这两种方式的编译器上,二者并没有太大的区别,但是两者仍然还是有一些细微的区别。 方式一: #ifndef __SOMEFILE_H__ #define __SOMEFILE_H__ … … // 一些声明语句 #endif 方式二...
这一点与#ifndef预处理指令有着本质的区别。#ifndef依赖于预处理宏的定义,而#pragma once是基于磁盘文件的,因此更为高效。使用#pragma once可以避免多重包含头文件可能导致的重定义错误。 ### #pragma warning #...
这里`#pragma code_seg(push, r1, ".my_data2")`创建了一个新的记录`r1`,并将其与`.my_data2`关联起来;而`#pragma code_seg(pop)`则会从内部编译器的堆栈中移除最后一个`push`操作创建的记录。 #### 四、#pragma ...
### 关于 `#pragma once` 的使用方法与技巧 #### 一、`#pragma once` 概述 `#pragma once` 是一个预处理器指令,主要用于C++编程中,尤其是在包含头文件时防止重复包含同一份头文件。尽管C++标准并没有明确规范 `#...
下面,我们将深入探讨几个常见的 `#pragma` 指令,并详细解释它们的功能与用途。 #### 1. #pragma message 指令 `#pragma message` 指令可以在编译过程中向编译器输出一条信息,这对于调试和源代码管理特别有用。...
`#pragma once`是一个非常实用的指令,它可以确保包含该指令的头文件在整个编译单元中仅被包含一次。这相当于使用传统的`#ifndef`、`#define`和`#endif`组合来避免重复包含问题,但在现代IDE中更受欢迎且易于阅读。 ...
与传统的`#ifndef`/`#define`/`#endif`相比,`#pragma once`更简洁且易于维护。 ##### 3. `#pragma warning` **用途**:控制编译器的警告信息,可以用来禁用某些警告或调整警告等级。 - **示例**: ```cpp #...
C++ 中pragma once 与 #ifndef _XXX_H_ #define _XXX_H_的区别 pragma once 之前一直用的很好,今天和同事的配合中发现自己没有真正理解pragma once。 原因:同事喜欢把公共的头文件通过生成后事件复制到一个公共的...
由于`basic.h`还包含了`#pragma once`指令,这确保了即使`basic.h`被多个源文件包含,该消息也只会被输出一次。 #### 2\. `#pragma once` `#pragma once` 是一种广泛使用的预处理指令,它的主要功能是确保一个...
这与`#ifndef`、`#define`、`#endif`的include guard机制有相同的效果,但`#pragma once`更简洁,且通常被认为效率更高。例如: ```cpp #if _MSC_VER > 1000 #pragma once #endif ``` 上述代码仅在Microsoft...
`#pragma once` 是一种非标准的编译器特性,其效果与 `#ifndef`、`#define`、`#endif` 相似,但更简洁。它指示编译器如果已经处理过当前的头文件,就不再继续处理。这个指令对大多数现代编译器都有效,但不是C++...
虽然大多数现代编译器支持#include卫士(如`#ifndef`、`#define`和`#endif`),但`#pragma once`提供了一种更简洁的方式,尤其是在Visual C++中。 4. **#pragma hdrstop** 当使用预编译头文件时,`#pragma hdrstop...
1. #pragma once:保证所在文件只会被包含一次,它是基于磁盘文件的,而#ifndef则是基于宏的。 2. #pragma warning:允许有选择性的修改编译器的警告消息的行为。例如,#pragma warning(disable:4507 34)可以屏蔽...
#pragma once #endif #ifndef __cplusplus #error You must use C++ compiler, or you need filename with '.cpp' suffix #endif #if defined(_INC_CONIO) || defined(_CONIO_H_) #error can not include "conio.h...