看到先 #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
不是所有版本都支持#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则由编译器提供保证:同一个文件不会被包含多次。注意这里所说的“同一个文件”是指物理上的一个文件,而不是指内容相同的两个文件。带来的好处是,你不必再费劲想个宏名了,当然也就不会出现宏名碰撞引发的奇怪问题。对应的缺点就是如果某个头文件有多份拷贝,本方法不能保证他们不被重复包含。当然,相比宏名碰撞引发的“找不到声明”的问题,重复包含更容易被发现并修正。
#ifndef的方式依赖于宏名字不能冲突,这不光可以保证同一个文件不会被包含多次,也能保证内容完全相同的两个文件不会被不小心同时包含。当然,缺点就是如果不同头文件的宏名不小心“撞车”,可能就会导致头文件明明存在,编译器却硬说找不到声明的状况
#pragma once则由编译器提供保证:同一个文件不会被包含多次。注意这里所说的“同一个文件”是指物理上的一个文件,而不是指内容相同的两个文件。带来的好处是,你不必再费劲想个宏名了,当然也就不会出现宏名碰撞引发的奇怪问题。对应的缺点就是如果某个头文件有多份拷贝,本方法不能保证他们不被重复包含。当然,相比宏名碰撞引发的“找不到声明”的问题,重复包含更容易被发现并修正。
#3
请无视我的回答吧,学习了
#4
#ifndef __AFXSTR_H__
#define __AFXSTR_H__
//只有没定义__AFXSTR_H__时才能进来吧,这时 #pragma once 还有用途吗?
//为了兼容,这里不要 #pragma once 不是也可以?
#pragma once
#endif // __AFXSTR_H__ (whole file)
#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__
#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
不是所有版本都支持#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则由编译器提供保证:同一个文件不会被包含多次。注意这里所说的“同一个文件”是指物理上的一个文件,而不是指内容相同的两个文件。带来的好处是,你不必再费劲想个宏名了,当然也就不会出现宏名碰撞引发的奇怪问题。对应的缺点就是如果某个头文件有多份拷贝,本方法不能保证他们不被重复包含。当然,相比宏名碰撞引发的“找不到声明”的问题,重复包含更容易被发现并修正。
#ifndef的方式依赖于宏名字不能冲突,这不光可以保证同一个文件不会被包含多次,也能保证内容完全相同的两个文件不会被不小心同时包含。当然,缺点就是如果不同头文件的宏名不小心“撞车”,可能就会导致头文件明明存在,编译器却硬说找不到声明的状况
#pragma once则由编译器提供保证:同一个文件不会被包含多次。注意这里所说的“同一个文件”是指物理上的一个文件,而不是指内容相同的两个文件。带来的好处是,你不必再费劲想个宏名了,当然也就不会出现宏名碰撞引发的奇怪问题。对应的缺点就是如果某个头文件有多份拷贝,本方法不能保证他们不被重复包含。当然,相比宏名碰撞引发的“找不到声明”的问题,重复包含更容易被发现并修正。
#3
请无视我的回答吧,学习了
#4
#ifndef __AFXSTR_H__
#define __AFXSTR_H__
//只有没定义__AFXSTR_H__时才能进来吧,这时 #pragma once 还有用途吗?
//为了兼容,这里不要 #pragma once 不是也可以?
#pragma once
#endif // __AFXSTR_H__ (whole file)
#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__
#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__