#pragma 详解(转)
来源:互联网 发布:java获取当前路径 编辑:程序博客网 时间:2024/05/19 20:45
概要:
1. #pragma link "libname"
使用pragma link可以在工程里加入了一个名为libname的库文件。
2. #pragma data_seg(".sdata") //数据段开始。
int data_share=0;
注意点:
A.这里的变量data_share必须初始化
B.必须在.def文件或link参数中指定此数据段.sdata为共享段,这样才可能实现不同实例间的数据共享
#pragma data_seg() //数据段结束。
这样可以在这个可执行文件的各个映像之间共享这个变量。
比如可以统计这个程序一共启动了几个副本。
在编译信息输出窗口中输出相应的信息;
4.#pragma code_seg(["section-name"[,"section-class"]])
设置程序中函数代码存放的代码段,对开发驱动程序很有用处;
5.#pragma once
在头文件的最开始加入这条指令就能够保证头文件被编译一次;
6.#pragma hdrstop
表示预编译头文件到此为止,后面的头文件不进行预编译;
7.#pragma resource "*.dfm"
把*.dfm文件中的资源加入工程,*.dfm中包括窗体外观的定义;
8.pragma comment(...)
详解:
在所有的预处理指令中,#pragma 指令可能是最复杂的了,它的作用是设定编译器的状态或者是指示编译器完成一些特定的动作。
#pragma指令对每个编译器给出了一个方法,在保持与C和C++语言完全兼容的情况下,给出主机或操作系统专有的特征。
依据定义,编译指示是机器或操作系统专有的,且对于每个编译器都是不同的。
(1)message参数
这对于源代码信息的控制是非常重要的。其使用方法为:
此时我们可以用这条指令在编译的时候就进行检查。假设我们希望判断自己有没有在源代码的什么地方定义了_X86这个宏,
可以用下面的方法:
我们就不会因为不记得自己定义的一些特定的宏而抓耳挠腮了。
(2)另一个使用得比较多的pragma参数是code_seg
(3)#pragma once (比较常用)
但是考虑到兼容性并没有太多的使用它。
(4)#pragma hdrstop
但如果所有头文件都进行预编译又可能占太多磁盘空间,所以使用这个选项排除一些头文件。
你可以用#pragma startup指定编译优先级,如果使用了#pragma package(smart_init),
BCB就会根据优先级的大小先后编译。
(5)#pragma resource "*.dfm"
外观的定义。
(6)#pragma warning( disable: 4507 34; once: 4385; error: 164)
(7)#pragma comment(...)
常用的lib关键字,可以帮我们连入一个库文件。如:
例如,对循环优化功能:
#pragmaloop_opt(on)
有时,程序中会有些函数会使编译器发出你熟知而想忽略的警告,
如“Parameter xxx is never used in function xxx”,可以这样:
#pragma warn—100
int insert_record(REC *r)
{ }
#pragma warn+100
每个编译器对#pragma的实现不同,在一个编译器中有效在别的编译器中几乎无效。可从编译器的文档中查看。
补充 —— #pragma pack 与 内存对齐问题
就要求该类型数据的地址总是8的倍数,而char类型数据(1字节)则可以从任何一个地址开始。
(比如long,double)都以4为对齐模数。
填充区就是为了使结构体字段满足内存对齐要求而额外分配给结构体的空间。那么结构体本身有什么对齐要求吗?
有的,ANSI C标准规定结构体类型的对齐要求不能比它所有字段中要求最严格的那个宽松,可以更严格。
如何使用c/c++中的对齐选项
n字节边界对齐的意思是说,一个成员的地址必须安排在成员的尺寸的整数倍地址上或者是n的整数倍地址上,取它们中的最小值。
也就是:
(1) #pragma pack( [ n ] )
紧凑对齐用pack编译指示在数据说明层设置。该编译指示在其出现后的第一个结构或联合说明处生效。
该编译指示对定义无效。
如果你使用无参量的#pragma pack, 结构成员被紧凑为以/Zp 指定的值。该缺省/Zp 紧凑值为/Zp8 。
(2) 编译器也支持以下增强型语法:
带push参量的pack编译指示的每次出现将当前的紧凑对齐存储到一个内部编译器堆栈中。
如果你给出一个n 的值, 该值将成为新的紧凑值。若你指定一个标识符, 即你选定一个名称,
则该标识符将和这个新的的紧凑值联系起来。
如果你使用pop参量且内部编译器堆栈是空的,则紧凑值为命令行给定的值, 并且将产生一个警告信息。
若你使用pop且指定一个n的值, 该值将成为新的紧凑值。若你使用p o p 且指定一个标识符,
所有存储在堆栈中的值将从栈中删除, 直到找到一个匹配的标识符, 这个与标识符相关的紧凑值也从栈中移出,
并且这个仅在标识符入栈之前存在的紧凑值成为新的紧凑值。如果未找到匹配的标识符,
将使用命令行设置的紧凑值,并且将产生一个一级警告。缺省紧凑对齐为8 。
紧凑值是一样的。
(3)栈内存对齐
- #pragma 详解(转)
- #pragma指令详解(转)
- #pragma用法详解[转]
- [转]#pragma 详解
- [转]#pragma 预处理指令详解
- #pragma 预处理指令详解[转]
- [转]#pragma 预处理指令详解
- 【转】#pragma 预处理指令详解
- [转]#pragma 预处理指令详解
- 【转】#pragma 预处理指令详解
- pragma pack 宏
- #pragma 预处理指令详解(转自Roy的blog)
- #pragma pack(n)对齐用法详解(转) - [C_C++]
- #pragma pack(n)对齐用法详解(转)
- #pragma详解
- #pragma详解
- #pragma详解
- #pragma详解
- C++的前置声明
- 拷贝构造函数的参数类型必须是引用
- 堆和栈的区别(转帖)
- VC++调试大全
- C++命名规范
- #pragma 详解(转)
- (转)VS 反汇编方法及常用汇编…
- (转)汇编中各寄存器的作用
- C++中的虚函数表(转)
- Win7下从U盘安装CentOSo6.1的经验
- Win7+VMware Workstation环境…
- (转) OSI七层模型与TCP/IP五层模型
- Makefile 中:= ?= += =的区别(转)
- Win7&CentOS双系统问题解决