#pragma once和#pragma pack等各自的作用

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 )

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值