#Pragma命令解释

重要的#pragma声明 重要的#pragma声明 #pragma声明是基于单片机开发的特点而对标准C语法的一个扩充。它对充分利用单片机内各类有限的资源起到不可或缺的关键作用。下面简单介绍几个最常用的#pragma声明。 1 #pragma DATA_SEG 定义变量所处的数据段。其语法型式为: #pragma DATA_SEG 名称 数据段名称可以自己任意命名,但习惯上有些约定的名称,其作用分别为:  阅读详情

 

 (本文系网络转载,为了学习方便转到自己的空间,仅供参考) 

#Pragma是预处理指令,它的作用是设定编译器的状态或者是指示编译器完成一些特定的动作。#Pragma指令对每个编译器给出了一个方法,在保持与C和C++语言完全兼容的情况下,给出主机或操作系统专有的特征。依据定义,编译指示是机器或操作系统专有的,且对于每个编译器都是不同的。

其格式一般为: #Pragma Para
其中Para 为参数,下面来看一些常用的参数。

(1)message 参数。 Message 参数是我最喜欢的一个参数,它能够在编译信息输出窗口中输出相应的信息,这对于源代码信息的控制是非常重要的。其使用方法为:
#Pragma message(“消息文本”)
当编译器遇到这条指令时就在编译输出窗口中将消息文本打印出来。当我们在程序中定义了许多宏来控制源代码版本的时候,我们自己有可能都会忘记有没有正确的设置这些宏,此时我们可以用这条指令在编译的时候就进行检查。假设我们希望判断自己有没有在源代码的什么地方定义了_X86这个宏可以用下面的方法
#ifdef _X86
#Pragma message(“_X86 macro activated!”)
#endif
当我们定义了_X86这个宏以后,应用程序在编译时就会在编译输出窗口里显示“_
X86 macro activated!”。我们就不会因为不记得自己定义的一些特定的宏而抓耳挠腮了。

(2)另一个使用得比较多的pragma参数是code_seg。格式如:
#pragma code_seg( [/section-name/[,/section-class/] ] )
它能够设置程序中函数代码存放的代码段,使用没有section-name字符串的#pragmacode_seg可在编译开始时将其复位,当我们开发驱动程序的时候就会使用到它。

(3)#pragma once (比较常用)
只要在头文件的最开始加入这条指令就能够保证头文件被编译一次,这条指令实际上在VC6中就已经有了,但是考虑到兼容性并没有太多的使用它。

(4)#pragma hdrstop表示预编译头文件到此为止,后面的头文件不进行预编译。BCB可以预编译头文件以加快链接的速度,但如果所有头文件都进行预编译又可能占太多磁盘空间,所以使用这个选项排除一些头文件。有时单元之间有依赖关系,比如单元A依赖单元B,所以单元B要先于单元A编译。你可以用#pragma startup指定编译优先级,如果使用了#pragma package(smart_init) ,BCB就会根据优先级的大小先后编译。

(5)#pragma resource /*.dfm/表示把*.dfm文件中的资源加入工程。*.dfm中包括窗体外观的定义。

(6)#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 )
在这段代码的最后,重新保存所有的警告信息(包括4705,4706和4707)。

(7)pragma comment(...)
该指令将一个注释记录放入一个对象文件或可执行文件中。
常用的lib关键字,可以帮我们连入一个库文件。

(8)·通过#pragma pack(n)改变C编译器的字节对齐方式
在C语言中,结构是一种复合数据类型,其构成元素既可以是基本数据类型(如int、long、float等)的变量,也可以是一些复合数据类型(如数组、结构、联合等)的数据单元。在结构中,编译器为结构的每个成员按其自然对界(alignment)条件分配空间。各个成员按照它们被声明的顺序在内存中顺序存储,第一个成员的地址和整个结构的地址相同。
例如,下面的结构各成员空间分配情况:
struct test
{
        char x1; // 偏移地址为0
        short x2;// 偏移地址为[2,3]
        float x3;// 偏移地址为[4,7]
        char x4; // 偏移地址为8
};
      结构的第一个成员x1,其偏移地址为0,占据了第1个字节。第二个成员x2为short类型,其起始地址必须2字节对界,因此,编译器在x2和x1之间填充了一个空字节。结构的第三个成员x3和第四个成员x4恰好落在其自然对界地址上,在它们前面不需要额外的填充字节。在test结构中,成员x3要求4字节对界,是该结构所有成员中要求的最大对界单元,因而test结构的自然对界条件为4字节,编译器在成员x4后面填充了3个空字节。整个结构所占据空间为12字节。更改C编译器的
缺省字节对齐方式在缺省情况下,C编译器为每一个变量或是数据单元按其自然对界条件分配
空间。一般地,可以通过下面的方法来改变缺省的对界条件:
  · 使用伪指令#pragma pack (n),C编译器将按照n个字节对齐。
     · 使用伪指令#pragma pack (),取消自定义字节对齐方式。
        另外,还有如下的一种方式:
     · __attribute((aligned (n))),让所作用的结构成员对齐在n字节自然边界上。如果结构中有成员的长度大于n,则按照最大成员的长度来对齐。
     · __attribute__ ((packed)),取消结构在编译过程中的优化对齐,按照实际占用字节数进行对齐。
以上的n = 1, 2, 4, 8, 16... 第一种方式较为常见。
应用实例
  在网络协议编程中,经常会处理不同协议的数据报文。一种方法是通过指针偏移的
方法来得到各种信息,但这样做不仅编程复杂,而且一旦协议有变化,程序修改起来
也比较麻烦。在了解了编译器对结构空间的分配原则之后,我们完全可以利用这
一特性定义自己的协议结构,通过访问结构的成员来获取各种信息。这样做,
不仅简化了编程,而且即使协议发生变化,我们也只需修改协议结构的定义即可,
其它程序无需修改,省时省力。下面以TCP协议首部为例,说明如何定义协议结构。
其协议结构定义如下:
#pragma pack(1) // 按照1字节方式进行对齐
struct TCPHEADER
{
        short SrcPort; // 16位源端口号
        short DstPort; // 16位目的端口号
        int SerialNo; // 32位序列号
        int AckNo; // 32位确认号
        unsigned char HaderLen : 4; // 4位首部长度
        unsigned char Reserved1 : 4; // 保留6位中的4位
        unsigned char Reserved2 : 2; // 保留6位中的2位
        unsigned char URG : 1;
        unsigned char ACK : 1;
        unsigned char PSH : 1;
        unsigned char RST : 1;
        unsigned char SYN : 1;
        unsigned char FIN : 1;
        short WindowSize; // 16位窗口大小
        short TcpChkSum; // 16位TCP检验和
        short UrgentPointer; // 16位紧急指针
};
#pragma pack() // 取消1字节对齐方式

#pragma pack规定的对齐长度,实际使用的规则是:
结构,联合,或者类的数据成员,第一个放在偏移为0的地方,以后每个数据成员的对齐,按照#pragma pack指定的数值和这个数据成员自身长度中,比较小的那个进行。
也就是说,当#pragma pack的值等于或超过所有数据成员长度的时候,这个值的大小将不产生任何效果。
而结构整体的对齐,则按照结构体中最大的数据成员 和 #pragma pack指定值 之间,较小的那个进行。

指定连接要使用的库
比如我们连接的时候用到了 WSock32.lib,你当然可以不辞辛苦地把它加入到你的工程中。但是我觉得更方便的方法是使用 #pragma 指示符,指定要连接的库:
#pragma comment(lib, "WSock32.lib")

 

本文来自优快云博客,转载请标明出处:http://blog.youkuaiyun.com/arthur9984/archive/2008/04/17/2300605.aspx

c++builder 中关于#pragma使用整理 c++builder 中关于#pragma使用 关于#pragma的预编译,在不同编辑器内都有所不同,这里只针对C++Builder的做一些记录。 1.#pragma alignment(这个我在网上找到的,不是很理解,暂做记录)         alignment pragma用于显示一条当前内存对齐(alignment)和枚举(enum)字节大小的消息。例如:     阅读详情

相关推荐

BL0910-从零到一:多路交/直流电能计量的实战配置与校准

本文详细介绍了BL0910芯片在多路交直流电能计量中的实战应用。从硬件连接、SPI通信配置,到软件初始化、核心寄存器设置,再到偏置与增益校准,提供了完整的配置与校准指南。文章重点阐述了直流测量模式的切换要点及数据读取的工程化处理,帮助开发者快速实现高精度、多通道的电能监控方案。

rice5的博客 564

#pragma comment(lib, "WSock32.lib")

#pragma 的使用 尽管 C 和 C++ 都已经有标准,但是几乎每个编译器 (广义,包含连接器等) 扩展一些 C/C++ 关键字。 合理地应用这些关键字,有时候能使我们的工作非常方便。下面随便说说 Visual C++ 中 #pragma 指示符的使用。 一、用#pragma导出DLL函数     传统的到出 DLL 函数的方法是使用模块定义文件 (.def),V

thinker 3853

从Verilog到GDS:手把手教你搞定Calibre LVS物理验证(附常见报错解决)

本文详细介绍了从Verilog到GDS的Calibre LVS物理验证全流程,包括工具链配置、RTL到SPICE网表转换、LVS运行配置及高级技巧。重点解析了常见报错如网络不匹配、器件不匹配和电源引脚缺失的解决方案,帮助工程师高效完成芯片物理验证,确保设计正确性。

culing2941的博客 507

#pragma comment(lib,"wsock32.lib")是干什么用的?

这句话的前面意思是静态加入一个lib文件,也就是库文件。这是告诉编译器在编译形成的.obj文件和.exe文件中加一条信息,使得 链接器在链接库的时候要去找wsock32.lib这个库,不要先去找别的库。 (.exe文件找DLL 也是这种写法,例如 wsock32.dll).

NCTU_to_prove_safety的博客 933

【FPGA】高效捕捉信号边沿的硬件实现技巧

本文深入探讨了FPGA设计中高效捕捉信号边沿的硬件实现技巧。核心在于通过“打两拍”同步器处理亚稳态风险,并详细解析了上升沿、下降沿及双边沿检测的基础原理与Verilog实现。文章进一步介绍了脉冲展宽、数字滤波等高级优化方案,并结合UART起始位检测与按键消抖等实战场景,提供了可靠的代码范例与调试心得,帮助工程师构建稳定可靠的边沿检测模块。

weixin_29165465的博客 225

QMT与通达信代码实战:从预警到交易的自动化实现

本文详细介绍了如何利用QMT量化交易平台与通达信软件实现从预警到交易的全自动化。通过读取通达信预警生成的板块文件,QMT策略可自动执行买卖指令,有效解决手动交易滞后问题。文章提供了完整的代码框架、核心原理拆解及实盘注意事项,帮助投资者构建高效、纪律性的自动化交易系统。

ansible6ops的博客 648

Keil5调试代码时关于警告及错误信息的处理

图一 Warning 图二 NoWarning Keil中出现warning:...

fengcq126的专栏 1万+

推免保研夏令营/预推免面试记录—北航网安

链接:https://pan.baidu.com/s/1vkP3EzbVrCc8a7wgQuUZgQ?链接:https://pan.baidu.com/s/1n4EFS2c9WLAfQn91CP4j2g?链接:https://pan.baidu.com/s/1VVNNSfcNDWjXhVhH3MtNjA?上面五个比例基本为:1:5:2:1:1。面试时间:当天上午面试,但是没面完,下午吃了饭之后又继续面试。--来自百度网盘超级会员V5的分享。--来自百度网盘超级会员V5的分享。

admin的博客 3011

Keic C51中几个预处理指令

  Keic C51中几个预处理指令1.#message 用法:#message "message"用途:当编译器编译到#message处会在编译输出栏中输出message消息,这时程序员可以知道编译器已经并且编译了该处,可以用来

nana1108的专栏 2261

基于YOLOv8的MVTec AD缺陷检测系统设计与实现

速度快,精度高;支持 anchor-free 架构;支持实例分割和图像分类;模块化代码,易于部署与改进;完美兼容 ONNX、TensorRT 等推理框架;官方支持多平台训练和推理(CPU/GPU)。YOLOv8 是工业视觉检测落地非常理想的选择。MVTec AD(Anomaly Detection)数据集包括15类工业对象,每个对象包括多个子类缺陷(例如 “scratch”, “crack”, “hole”)及正常图像。类别缺陷子类bottlecablecapsule。

YOLO 931

1. 如何使用扣子工作流一键生成儿童绘本(可以发到小红书,微信公众号图文等)

本文介绍了使用扣子智能体一键生成儿童绘本的工作流。用户只需输入绘本主题,系统会自动生成Markdown格式内容,可直接发布到优快云、小红书等平台,还支持推送至微信公众号草稿箱。操作步骤包括:访问扣子网站导入工作流源代码,输入主题试运行,查看实时进度和最终输出结果。工作流编辑器会显示每个节点的执行状态和耗时,支持通过"查看日志"功能回溯历史运行记录。文末附有工作流源代码下载链接。

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 1245

#pragma用法详解

概述 我们在写代码时,总会遇到头文件多次包含的情况,刚开始时我们使用宏定义进行控制,之后发现有#pragma once这样简单的东西,当时是很兴奋,以为#pragma就这一种用法。 1、什么是预处理 预处理是将源文件的文本作为翻译的第一阶段操作的文本处理步骤。 预处理不会分析源文本,但会为了查找宏调用而将源文本细分为标记。 主要包括了下面三个方面: 预处理指令 预处理运算符 预定义宏,这个有很多了,比如__FILE__、__LINE__和__DATA__等。 其中预处理指令包括: 预处理运算符包括: 这里有

qq_40569221的博客 2万+

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

C/C++中关于 #pragma 的深度探究

不知大家在写代码的过程中有没有遇到过这个东西????#pragma once, 在初学阶段大家对这个估计都习以为常,这不,最近在看别人代码的时候发现原来这么一个潜伏在角落的平平无奇的#pragma竟然是大佬!于是便好好研究了一番。 话说咱写代码的时候啊,总会遇到头文件被多次包含的情况,刚开始时我们使用宏定义进行控制,之后发现有#pragma once这样简单的东西,开心的不得了,以为#pragma就这一种用法。害,想起当时还真是年轻。 那么pragma究竟是何方神圣呢,这咱还得从预处理讲起。 C程序在整个编

weixin_45983489的博客 2186

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

#pragma pack 内存对齐

本文介绍了C/C++中的内存对齐机制。内存对齐是为了提高访问效率,要求数据按特定规则排列而非连续存储。默认对齐模数在32位系统中为4字节,可通过#pragma pack调整。结构体/类的对齐规则包括:1)成员按自身大小和对齐模数中较小值对齐;2)整体大小需为最大成员对齐值的整数倍。静态成员不参与大小计算。文章通过多个示例演示了不同情况下的内存布局,并说明#pragma pack的用法(push/pop修改对齐值)。手动设置对齐模数会影响结构体成员排列方式和总大小,实际开发中需权衡性能和内存空间。

人无远虑,必有近忧 1603

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

Linux之#pragma的用法

预编译指令#pragma的用法最近在看开源项目中的代码时,发现许多地方都用到了#pragma的程序。因此,就问了下谷歌老师,总结了下#pragma预编译指令的常用用法,现在和大家分享下。一.#pragma最常用的方法1. #progma pack(n)1>功能:使用#progma pack预编译指令可以改变编译器的默认值(不是绝对的,有些编译器只能是固定的数据对齐方式)。2>说明大多数情况下,我们

冀博 1万+

#pragma 的几种用法

转自:https://blog.youkuaiyun.com/houyichaochao/article/details/80555218 预编译指令#pragma有很多种用法,我敢保证很多程序员即使是一辈子也不会碰到其中的有些用法,是 的,他们的确很偏僻,我们也没有用他们的需求。所以,本文不会面面俱到,只是把几种常用的几种汇总 了一下。 1. #pragma once 保证头文件只被include一...

dayou1024的博客 2737

#pragma

解析#pragma指令预处理指令,设定编译器的状态或者是指示编译器完成一些特定的动作。#pragma指令对每个编译器给出了一个方法,在保持与C和C ++语言完全兼容的情况下,给出主机或操作系统专有的特征。依据定义,编译指示是机器或操作系统专有的,且对于每个编译器都是不同的。其格式一般为:#Pragma Para,其中Para 为参数,下面来看一些常用的参数。(1) message参数。它能够在编译信息输出窗口中输出相应的信息,这对于源代码信息的控制是非常重要的。其使用方法为:    #Pragma mes

jamestaosh 6419

#Pragma 指令

在所有的预处理指令中,#Pragma  指令可能是最复杂的了,他的作用是设定编译器的状态或是指示编译器完成一些特定的动作。#pragma指令对每个编译器给出了一个方法,在保持和C和C++语言完全兼容的情况下,给出主机或操作系统专有的特征。依据定义,编译指示是机器或操作系统专有的,且对于每个编译器都是不同的。  其格式一般为:        #Pragma  Para         其中Para  为参数,下面来看一些常用的参数。         (1)message  参数。  Message  参数是我

lw13018088517的专栏 4402

#pragma的常用方法讲解

#pragma的常用方法

whl0071的专栏 1045

#pragma once用法总结

#pragma指令与#ifndef指令 在C/C++中,在使用预编译指令#include的时候,为了防止重复引用造成二义性,通常有两种方式—— 第一种是#ifndef指令防止代码块重复引用,比如说 #ifndef _CODE_BLOCK #define _CODE_BLOCK // code #endif// _CODE_BLOCK 第二种就是#pragma once指令,在想要保护的文件开头写入 #pragma once #ifnd...

木牛的博客 4603

#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_DIS

qq_39048131的博客 793

#pragma不为人知的秘密

1、#pragma(n)和#pragma pack() #pragma pack(1) /* 1字节对齐 */ struct test { int a; char b; int c; short d; }; #pragma pack() /* 还原默认对齐 */ 结论1:#pragma(n)和#pragma pack()一起用是在这期间保证n字节对齐,而且要成对存在 #pragma(push)和#pragma(pop) #pragma(push):push是"压入"的意思。

weixin_44458100的博客 1046
上一篇: MFC的程序执行顺序
下一篇: C语言中的运算符 详细说明
pstrunner
博客等级 码龄19年 50粉丝 52原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值