为什么先#ifndef __ATLSTR_H__ 然后又#pragma once?

时间:2023-02-02 22:43:43
打开C:\Program Files\Microsoft Visual Studio 8\VC\atlmfc\include\atlstr.h
看到先 #ifndef __ATLSTR_H__
然后又 #pragma once

为什么这么用?

5 个解决方案

#1


为了兼容
不是所有版本都支持#pragma once 
你注意一下VC6自动生成的头文件都是下面这样的
#if !defined 。。。
#define。。。
//}}AFX_CODEJOCK_PRIVATE

#if _MSC_VER >= 1000
#pragma once
#endif // _MSC_VER >= 1000

而vc7只有#pragma once

#2


双重保险......
#ifndef的方式依赖于宏名字不能冲突,这不光可以保证同一个文件不会被包含多次,也能保证内容完全相同的两个文件不会被不小心同时包含。当然,缺点就是如果不同头文件的宏名不小心“撞车”,可能就会导致头文件明明存在,编译器却硬说找不到声明的状况

    #pragma once则由编译器提供保证:同一个文件不会被包含多次。注意这里所说的“同一个文件”是指物理上的一个文件,而不是指内容相同的两个文件。带来的好处是,你不必再费劲想个宏名了,当然也就不会出现宏名碰撞引发的奇怪问题。对应的缺点就是如果某个头文件有多份拷贝,本方法不能保证他们不被重复包含。当然,相比宏名碰撞引发的“找不到声明”的问题,重复包含更容易被发现并修正。

#3


请无视我的回答吧,学习了

#4


#ifndef __AFXSTR_H__
#define __AFXSTR_H__

//只有没定义__AFXSTR_H__时才能进来吧,这时 #pragma once 还有用途吗?
//为了兼容,这里不要 #pragma once 不是也可以?

#pragma once

#endif // __AFXSTR_H__ (whole file)

#5


看了一下msdn,里面是这样解释的
#pragma once
Specifies that the file will be included (opened) only once by the compiler in a build. This can reduce build times as the compiler will not open and read the file after the first #include of the module.


如果用#pragma once的话,编译器再遇到包含这个同文件的时候就不再打开文件了,从而减少打开文件,读文件的次数
而如果用#ifndef __AFXSTR_H__  #define __AFXSTR_H__每次都会打开这个头文件,并读文件内容来判断 __AFXSTR_H__  

#1


为了兼容
不是所有版本都支持#pragma once 
你注意一下VC6自动生成的头文件都是下面这样的
#if !defined 。。。
#define。。。
//}}AFX_CODEJOCK_PRIVATE

#if _MSC_VER >= 1000
#pragma once
#endif // _MSC_VER >= 1000

而vc7只有#pragma once

#2


双重保险......
#ifndef的方式依赖于宏名字不能冲突,这不光可以保证同一个文件不会被包含多次,也能保证内容完全相同的两个文件不会被不小心同时包含。当然,缺点就是如果不同头文件的宏名不小心“撞车”,可能就会导致头文件明明存在,编译器却硬说找不到声明的状况

    #pragma once则由编译器提供保证:同一个文件不会被包含多次。注意这里所说的“同一个文件”是指物理上的一个文件,而不是指内容相同的两个文件。带来的好处是,你不必再费劲想个宏名了,当然也就不会出现宏名碰撞引发的奇怪问题。对应的缺点就是如果某个头文件有多份拷贝,本方法不能保证他们不被重复包含。当然,相比宏名碰撞引发的“找不到声明”的问题,重复包含更容易被发现并修正。

#3


请无视我的回答吧,学习了

#4


#ifndef __AFXSTR_H__
#define __AFXSTR_H__

//只有没定义__AFXSTR_H__时才能进来吧,这时 #pragma once 还有用途吗?
//为了兼容,这里不要 #pragma once 不是也可以?

#pragma once

#endif // __AFXSTR_H__ (whole file)

#5


看了一下msdn,里面是这样解释的
#pragma once
Specifies that the file will be included (opened) only once by the compiler in a build. This can reduce build times as the compiler will not open and read the file after the first #include of the module.


如果用#pragma once的话,编译器再遇到包含这个同文件的时候就不再打开文件了,从而减少打开文件,读文件的次数
而如果用#ifndef __AFXSTR_H__  #define __AFXSTR_H__每次都会打开这个头文件,并读文件内容来判断 __AFXSTR_H__