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

HIGE6 2008-11-28 11:59:32
打开C:\Program Files\Microsoft Visual Studio 8\VC\atlmfc\include\atlstr.h
看到先 #ifndef __ATLSTR_H__
然后又 #pragma once

为什么这么用?
...全文
255 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
zzz822163 2008-11-28
  • 打赏
  • 举报
回复
请无视我的回答吧,学习了
zzz822163 2008-11-28
  • 打赏
  • 举报
回复
双重保险......
#ifndef的方式依赖于宏名字不能冲突,这不光可以保证同一个文件不会被包含多次,也能保证内容完全相同的两个文件不会被不小心同时包含。当然,缺点就是如果不同头文件的宏名不小心“撞车”,可能就会导致头文件明明存在,编译器却硬说找不到声明的状况

#pragma once则由编译器提供保证:同一个文件不会被包含多次。注意这里所说的“同一个文件”是指物理上的一个文件,而不是指内容相同的两个文件。带来的好处是,你不必再费劲想个宏名了,当然也就不会出现宏名碰撞引发的奇怪问题。对应的缺点就是如果某个头文件有多份拷贝,本方法不能保证他们不被重复包含。当然,相比宏名碰撞引发的“找不到声明”的问题,重复包含更容易被发现并修正。
Conry 2008-11-28
  • 打赏
  • 举报
回复
为了兼容
不是所有版本都支持#pragma once
你注意一下VC6自动生成的头文件都是下面这样的
#if !defined 。。。
#define。。。
//}}AFX_CODEJOCK_PRIVATE

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

而vc7只有#pragma once
Conry 2008-11-28
  • 打赏
  • 举报
回复
看了一下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__
HIGE6 2008-11-28
  • 打赏
  • 举报
回复
#ifndef __AFXSTR_H__
#define __AFXSTR_H__

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

#pragma once

#endif // __AFXSTR_H__ (whole file)

16,473

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Web++
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

试试用AI创作助手写篇文章吧