VS打开c++头文件iostream发现以下代码;
// iostream standard header
#pragma once
#ifndef _IOSTREAM_
#define _IOSTREAM_
#ifndef RC_INVOKED
#include <istream>
#pragma pack(push,_CRT_PACKING)
#pragma warning(push,_STL_WARNING_LEVEL)
#pragma warning(disable: _STL_DISABLED_WARNINGS)
.....
#pragma warning(pop)
#pragma pack(pop)
#endif /* RC_INVOKED */
#endif /* _IOSTREAM_ */
一、#pragma once 宏的作用
转自: https://www.cnblogs.com/qiang-upc/p/11407364.html
为了同一个头文件被包含多次,c/c++有两种方式,一种是#ifndef ;另外一种就是 #parama once; 两种有些许差异;
使用上的区别
1 #ifndef
#ifndef _XXX_H_
#defien _XXX_H_
//something difine
#endif
2 #parama one
#parama one
//something difine
各自优缺点
1 #ifndef 方式
优点:不仅能保证同一文件不会被包含多次,也能保证内容完全相同的两个文件不会被不小心同时包含;
缺点:1)不同头文件的宏名不小心"撞车",可能会看到你头文件中的宏名明明存在,但是报错情况;
2)每次都必须打开头文件才能判定是否有重复定义;因此编译大型项目时,编译时间相对较长;
2 #parama one
优点:1) 同一文件不会被包含多次; 2)不用在担心宏名冲突; 3) 编译速度上快了一些;
缺点:1)若头文件有多份拷贝,不能保证他们不被重复包含; 2) 不支持跨平台;
很多时候也会看到一起用;似乎是想同时拥有两种优点?
#pragma once
#ifndef _IOSTREAM_
#define _IOSTREAM_
二、#pragma pack(n) 与 #pragma pack(push,n)
转自: https://blog.csdn.net/aidem_brown/article/details/77540527
1 #pragma pack(n)
#pragma pack(n) 作用:c编译器按照n字节对齐; 其中n为对齐系数;取值为1,2,4,8,16等;
#pragma pack() 作用:取消自定义字节对齐方式;
2 #pragma pack(push,n)
#pragma pack(push,n) 作用:把原来对齐方式设置压栈;并设置新的对齐方式为n字节对齐;
#parama pack(pop) 作用:恢复对齐状态;
三、#pragma warning
转自: https://blog.csdn.net/gggg_ggg/article/details/42006019
指令格式如下
#pragma warning( warning-specifier : warning-number-list [; warning-specifier : warning-number-list...]
#pragma warning( push[ ,n ] )
#pragma warning( pop )
主要用到的警告表示有:
- once :只显示一次警告/错误等消息;
- default 重置编译器的警告行为到默认状态;
- 1,2,3,4 四个警告级别;
- disable 禁止指定的警告消息;
- error 将指定的警告消息作为错误报告;
示例:
#pragma warning( disable : 4507 34; once : 4385; error : 164 )
等价于:
#pragma warning(disable:4507 34) // 不显示4507和34号警告信息
#pragma warning(once:4385) // 4385号警告信息仅报告一次
#pragma warning(error:164) // 把164号警告信息作为一个错误。
同时这个pragma warning 也支持如下格式:
#pragma warning( push [ ,n ] )
#pragma warning( pop )
这里n代表一个警告等级(1—4)。
#pragma warning( push )保存所有警告信息的现有的警告状态。
#pragma warning( push, n)保存所有警告信息的现有的警告状态,并且把全局警告等级设定为n。
#pragma warning( pop )向栈中弹出最后一个警告信息,在入栈和出栈之间所作的一切改动取消。
例如:
#pragma warning( push )
#pragma warning( disable : 4705 )
#pragma warning( disable : 4706 )
#pragma warning( disable : 4707 )
#pragma warning( pop )