博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
小侃#pragma
阅读量:4591 次
发布时间:2019-06-09

本文共 2992 字,大约阅读时间需要 9 分钟。

#pragma是一个编译器指令。

================================================================

 

#pragma comment(lib, libname)

将libname的库添加到工程中,与VC++中Linker->Input->Additional dependencies的功能相同。使用#pragma comment后其它用户拿到源文件后就能直接编译,而不需要再进行工程中的库依赖设置。例子如下:

 

 

#pragma comment(lib, "kernel32")#pragma comment(lib, "user32")

 

================================================================

 

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

指定函数存放在*.obj文件中的代码段,默认的代码段是.text

 

当code_seg()不跟参数默认将函数放在.text段;push与pop可选,push指将一个记录压入内部编译器栈,pop指将记录弹出内部编译器栈。例子如下:

 

// pragma_directive_code_seg.cppvoid func1() {                  // stored in .text}#pragma code_seg(".my_data1")void func2() {                  // stored in my_data1}#pragma code_seg(push, r1, ".my_data2")void func3() {                  // stored in my_data2}#pragma code_seg(pop, r1)      // stored in my_data1void func4() {}int main() {}

 

================================================================

 

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

使用例子如下:

 

 

// pragma_directive_data_seg.cppint h = 1;                     // stored in .dataint i = 0;                     // stored in .bss#pragma data_seg(".my_data1")int j = 1;                     // stored in "my_data1"#pragma data_seg(push, stack1, ".my_data2")   int l = 2;                     // stored in "my_data2"#pragma data_seg(pop, stack1)   // pop stack1 off the stackint m = 3;                     // stored in "stack_data1"int main() {}

 

除了data_seg和code_seg之外,还有

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

 

等关于段的定义。

================================================================

 

#pragma pack( [ show ] | [ push | pop ] [, identifier ] , n  )

编译器中提供了  pack(n)来设定 以n 方式。n 就是说 存放的起始地址的 有两种情况:第一、如果n大于等于该变量所占用的字节数,那么偏移量必须满足默认的对齐方式,第二、如果n小于该变量的类型所占用的字节数,那么偏移量为n的倍数,不用满足默认的对齐方式。结构的总大小也有个约束条件,分下面两种情况:如果n大于所有 类型所占用的字节数,那么结构的总大小必须为占用空间最大的变量占用的空间数的倍数;否则必须为n的倍数。n取值为1,2,4,8,16。

 

 

#pragma pack(push) //保存对齐状态#pragma pack(4)//设定为4字节对齐struct test{char m1;double m4;int m3;};#pragma pack(pop)//恢复对齐状态

也可以使用 __declspec(align( # ))来对齐用户自定义数据(比如结构体),如下,

 

 

__declspec(align(32)) struct Str1{   int a, b, c, d, e;};

================================================================

 

 

#pragma message( messagestring )

编译时在标准输出控制台显示消息。

 

 

#if _M_IX86 == 500#pragma message( "Pentium processor build" )#endif
#pragma message( "Compiling " __FILE__ ) #pragma message( "Last modified on " __TIMESTAMP__ )

================================================================

#pragma section( "section-name" [, attributes] )

在*.obj中创建一个新的段,段的属性(attributes)可以是:

 

read 可读

write 可写

execute 可执行

shared 进程共享

nopage

nocache

。。。等

 

#pragma section("mysec",read,write)int j = 0;__declspec(allocate("mysec")) int i;int i = 1;

其中j分配到了数据段,j分配到了mysec段。

 

 

 

转载于:https://www.cnblogs.com/pangblog/p/3303989.html

你可能感兴趣的文章
js数据结构与算法——集合
查看>>
程序员技术练级攻略(转载)
查看>>
Servlet入门
查看>>
【JQuery】jQuery(document).ready(function($) { });的几种表示方法及load和ready的区别
查看>>
单目运算符-双目运算符-三目运算符
查看>>
canvas图像以及剪切
查看>>
cookie ,session Storage, local storage
查看>>
finereport9.0破解版|finereport10.0破解并发数|finereport授权注册|FineBI5.0破解lic
查看>>
用10张图来看机器学习Machine learning in 10 pictures
查看>>
使用node.js定义一个web服务器
查看>>
任务16 被动信息收集
查看>>
1282: 排列计数 perm
查看>>
牛客小白月赛15 C 表单 ( map 使用)
查看>>
oracle中的索引
查看>>
STM8S——Analog/digital converter (ADC)
查看>>
LeetCode-211 Add and Search Word - Data structure design
查看>>
jquery each遍历节点使用
查看>>
sql笔记 获取指定数据库下的所有表
查看>>
第一个定时脚本--nginx日志的切割
查看>>
计算机科学导论---算法
查看>>