#pragma用法大全

article/2025/10/7 1:53:45

一、#pragma

1.1 #pragma message

message能够在编译信息输出窗口中输出相应的信息,这对于源代码信息的控制是非常重要的。

#pragma message("test message!")

1.2 #pragma code_seg

格式如:

#pragma code_seg( [ [ { push | pop}, ] [ identifier, ] ] [ "segment-name" [, "segment-class" ] ) 

该指令用来指定函数在.obj文件中存放的节,观察obj文件可以使用VC自带的dumpbin命令行程序,函数在.obj文件中默认的存放节为.text节。如果code_seg没有带参数的话,则函数存放在.text节中。

  • push (可选参数)将一个记录放到内部编译器的堆栈中,可选参数可以为一个标识符或者节名;
  • pop (可选参数)将一个记录从堆栈顶端弹出,该记录可以为一个标识符或者节名;
  • identifier (可选参数)当使用push指令时,为压入堆栈的记录指派的一个标识符,当该标识符被删除的时候和其相关的堆栈中的记录将被弹出堆栈;
  • segment-name (可选参数)表示函数存放的节名。

示列:

//默认情况下,函数被存放在.text节中
void func1() {                  // stored in .text
}//将函数存放在.my_data1节中
#pragma code_seg(".my_data1")
void func2() {                  // stored in my_data1
}//r1为标识符,将函数放入.my_data2节中
#pragma code_seg(push, r1, ".my_data2")
void func3() {                  // stored in my_data2
}int main() {
}

1.3 #pragma once

这是一个比较常用的指令,只要在头文件的最开始加入这条指令就能够保证头文件被编译一次

1.4 #pragma hdrstop

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

1.5 #pragma warning

该指令允许有选择性的修改编译器的警告消息的行为,指令格式如下:

#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号警告信息作为一个错误。  

在使用标准C++进行编程的时候经常会得到很多的警告信息,而这些警告信息都是不必要的提示,所以我们可以使用#pragma warning(disable:4786)来禁止该类型的警告。在vc中使用ADO的时候也会得到不必要的警告信息,这个时候我们可以通过#pragma warning(disable:4146)来消除该类型的警告信息。

1.6 pragma comment

该指令的格式为:

#pragma comment( "comment-type" [, commentstring] )

该指令将一个注释记录放入一个对象文件或可执行文件中
comment-type(注释类型):可以指定为五种预定义的标识符的其中一种,五种预定义的标识符为:

  • compiler:将编译器的版本号和名称放入目标文件中,本条注释记录将被编译器忽略。如果你为该记录类型提供了commentstring参数,编译器将会产生一个警告。例如:#pragma comment( compiler )
  • exestr: 将commentstring参数放入目标文件中,在链接的时候这个字符串将被放入到可执行文件中,当操作系统加载可执行文件的时候 ,该参数字符串不会被加载到内存中。但是,该字符串可以被dumpbin之类的程序查找出并打印出来,你可以用这个标识符将版本号码之类的信息嵌入到可执行文件中!
  • lib: 这是一个非常常用的关键字,用来将一个库文件链接到目标文件中常用的lib关键字,可以帮我们连入一个库文件。
  • user: 将一般的注释信息放入目标文件中commentstring参数包含注释的文本信息,这个注释记录将被链接器忽略
  • linker:指定一个连接选项,这样就不用在命令行输入或者在开发环境中设置了。

1.7 #pragma pack

#pragma pack(1)那做说明: #pragma pack(1)表示设置结构体的边界对齐为1个字节,也就是所有数据在内存中是连续存储。的。
比如你在C/C++语言中定义下面这样的结构体,输出它占用的字节大小:

#include <iostream>using namespace std;struct s {char ch;int i;
};int main() {cout << "占用内存大小:" << sizeof(s) << endl;return 0;
}

你觉得输出结果会是多少呢?我们知道,char型占用1个字节,int型占4个字节,那么输出的结果是5吗?答案是否定的。你可以自己试一下,输出结果为8。
为什么会这样呢?这是因为编译器为了让程序跑得跟快,减少CPU读取数据的指令周期,对结构体的存储进行了优化。实际上第一个char型成员虽然本来只有1个字节,但实际上却占用掉了4个字节,为的是让第二个int型成员的地址能够被4整除。因此实际占用的是8个字节。
而#pragma pack(1)让编译器将结构体数据强制连续排列,这样的话,sizeof(struct s)输出的结果就是5了。

在这里插入图片描述

示列:

设置内存对齐为:1字节对齐。使用方法如下:

#include <iostream>using namespace std;#pragma pack(1)
struct s {char ch;int i;
};
#pragma pack()int main() {cout << "占用内存大小:" << sizeof(s) << endl;return 0;
}

在这里插入图片描述

意思就是 以下代码编译出来的是以1个字节的方式对齐的。这样能节约内存资源,但是会在效率上有所影响。
可是,虽说在效率上有一定的影响,不过,如果编写的是基于协议,如串口通讯的程序,那么必须严格按照一定的规则进行接收数据包。那么,只要#pragma pack(1),让数据在内存中是连续的,才好处理的。

其他需要注意的地方:”

#pragma pack (n)             作用:C编译器将按照n个字节对齐。
#pragma pack ()              作用:取消自定义字节对齐方式。#pragma  pack (push,1)     	 作用:是指把原来对齐方式设置压栈,并设新的对齐方式设置为一个字节对齐
#pragma pack(pop)            作用:恢复对齐状态

http://chatgpt.dhexx.cn/article/6sElfZud.shtml

相关文章

C语言#pragma使用

1.#pragma简介 &#xff08;1&#xff09;#pragma用于指示编译器完成一些特定的动作 &#xff08;2&#xff09;#pragma所定义的很多指示字是编译器特有的 &#xff08;3&#xff09;#pragma在不同的编译器间是不可移植的 &#xff08;4&#xff09;预处理器将忽略它不认识的#…

C语言#pragma使用方法

C语言#pragma使用方法 一、总结 1、#pragma用于指示编译器完成一些特定的动作 2、#pragma所定义的很多指示字是编译器特有的(每种编译可能都不一样) &#xff08;1&#xff09; #pragma message 用于自定义编译信息 &#xff08;2&#xff09;#pragma once 用于保证头文件只被…

pragma是什么意思?(词源强迫症患者的无聊问题

------此处的pragma仅指各类编程语言中的预处理指令#pragma------ 作为一位词源强迫症患者&#xff0c;为了我自己&#xff08;以免遗忘&#xff09;和广大病友们&#xff0c;我将找到的一些信息源在此记录如下&#xff1a; ---中文信息 “#Pragma是预处理指令它的作用是设定编…

#pragma的常用方法讲解

概述 我们在写代码时&#xff0c;总会遇到头文件多次包含的情况&#xff0c;刚开始时我们使用宏定义进行控制&#xff0c;之后发现有#pragma once这样简单的东西&#xff0c;当时是很兴奋&#xff0c;以为#pragma就这一种用法。唉~&#xff0c;现在想想当时还是年轻啊&#xf…

Attribute(特性)

一向都觉得.NET的Attribute好神秘。一个方框框住的东西&#xff0c;置身于类、方法的头部&#xff0c;本身不在类或方法里面&#xff0c;但又会起作用&#xff0c;有时作用还很大&#xff0c;仿佛充满了魔力。简直给人一种无冕之王&#xff0c;幕后之黑手的感觉&#xff01; 某…

attribute的用法--C#

一直以来都没理解attribute是个什么东西&#xff0c;也没怎么用&#xff0c;但是看msdn或者git上源码使用的还是蛮频繁的&#xff0c;今天好好整理了下&#xff0c;写下自己的理解和例子&#xff1a; attribute主要用来说明代码段的的信息&#xff0c;标志等&#xff1b;可以一…

attribute属性

attribute属性 __attribute__介绍 attribute的格式. __attribute__((attribute-list))attribute属性可以在编译的时候告诉编译器函数, 结构体的属性是什么, 进行某些编译优化, 也可以提供更加准确的错误检查. attribute是GNU特有的特性 这里主要说明attribute的4个属性, 分…

【C#】Attribute

原文链接&#xff1a;http://bbs.51aspx.com/showtopic-33963.html 前言 作为一个.NET开发人员&#xff0c;了解Attribute的重要性&#xff0c;用.NET大师Jeffrey Richter的话就是“任何.NET Framework 开发人员都有必要对定制attribute有一个牢靠的掌握”&#xff0c;所以掌…

attributes() 函数

查看更多 https://www.yuque.com/docs/share/a6cc2c96-9824-4903-acb8-284f4ebeb4fb

__attribute__ 用法

转自&#xff1a;http://www.cnblogs.com/astwish/p/3460618.html GNU C 的一大特色就是__attribute__ 机制。__attribute__ 可以设置函数属性&#xff08;Function Attribute &#xff09;、变量属性&#xff08;Variable Attribute &#xff09;和类型属性&#xff08;Type …

View绘制体系(三)——AttributeSet与TypedArray详解

View绘制体系&#xff08;三&#xff09;——AttributeSet与TypedArray详解 前言 上篇博客中讲了LayoutInflater.inflate机制&#xff0c;其中提到了AttributeSet和XmlPullParser两个接口&#xff0c;这里我们来详细的了解一下Android中提供的AttributeSet接口和它与XmlPullPa…

Android自定义View(三)自定义属性AttributeSet

自定义View的时候通常需要提供一些自定义属性&#xff0c;自定义属性非常简单&#xff0c;只需要在res资源目录的values目录下创建一个attrs.xml的属性定义文件&#xff0c;然后在该文件中定义相应的属性&#xff0c;并在自定义View的构造函数中获取并设置自定义属性的默认值即…

web搜索框的制作(必应)

前两天没事突然对搜索来了兴趣&#xff0c;我一直在想搜索框中我们输入一些字或者字母&#xff0c;为何下面就会有一些自动补齐的相关搜索&#xff0c;比如我在搜索输入框中输入一个字母e&#xff0c;下面就会出现饿了么&#xff0c;e租宝&#xff0c;ems等相关的搜索链接。然后…

html怎么调搜索框宽高,百度站内搜索css:输入框宽度及样式自定义

近日网站使用了百度站内搜索api&#xff0c;目的是为了提高站内搜索的速度&#xff0c;减轻查询站内数据库带来的服务器压力。 不过在使用百度站内搜索api(生效范围&#xff1a;*webkaka.com/*)后发现一个问题&#xff0c;不同的频道模版造成排版不合适的后果&#xff0c;如搜索…

织梦手机站站内搜索

今天在做手机网站发现一个问题&#xff0c;当在手机是使用搜索功能时马上就跳转到电脑端网站去了&#xff0c;在手机上无法使用。在网上找半天没有找到解决的办法&#xff0c;后来自己想通了&#xff0c;下面告诉大家怎么样简单的实现这个功能&#xff01;我的手机站是在m/这个…

基于 Elasticsearch 的站内搜索引擎实战

站内搜索&#xff0c;可以认为是针对一个网站特性内容的搜索功能。由于内容、格式可控&#xff0c;站内搜索比全网搜索的实现要简单很多。 简书这个网站本身自带一个搜索&#xff0c;但是缺乏针对个人文章的搜索&#xff0c;所以本文的实战内容是解决这个痛点。 代码在 https…

使用swiftype实现站内搜索

本人博客opiece.me&#xff0c;欢迎访问。 前言 首先&#xff0c;以下的内容是基于最新的swifytpe的教程&#xff0c;应该是2.0.0。 站内搜索顾名思义就是将范围限定在你的网站内&#xff0c;以此范围进行关键字搜索。 常见的站内搜索是google和baidu的&#xff0c;但是现在…

Compass实战 站内搜索

今天早上打算对这两天学习的Lucene以及Compass总结一下,想来想去,还是写个小项目来验证最好了。于是就有了今天的这篇文章。难易程度适合对于Compass或者Lucene刚入门的童鞋,大牛看到后望轻喷 :-) 项目预览项目需求项目目录核心处理 发帖部分查询部分总结项目预览 项目需求 …

html中的搜索

目录 hello&#x1f604; form表单&#x1f349; form的语法&#x1f34a; from的属性&#x1f34a; 提交&#xff1f;重置&#xff1f;&#x1f34a; 表单按钮&#xff08;html&#xff09;&#x1f50d; JavaScript提交表单&#x1f50d; JavaScript重置表单&#x1f…

必应(Bing)的站内搜索 site:<域名> <搜索内容>

最近在备考OCP&#xff0c;发现有一个网站的题库很好&#xff0c;就是www.examtopics.com&#xff0c;有很多Oracle的考题&#xff0c;都是在这里面搜到的&#xff0c;而且每道题都有人讨论。 为了加快搜索速度&#xff0c;提高精度&#xff0c;可以用Bing在这个网站内搜索&am…