文档库 最新最全的文档下载
当前位置:文档库 › pragma的用法

pragma的用法

pragma的用法
pragma的用法

#pragma的用法

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

编译指示是机器或操作系统专有的,且对于每个编译器都是不同的。

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

1)message 参数

message参数是我最喜欢的一个参数,它能够在编译信息输出窗口中输出相应的信息,这对于源代码信息的控制是非常重要的。其使用方法为:

#pragma message("消息文本")

当编译器遇到这条指令时就在编译输出窗口中将消息文本打印出来。

当我们在程序中定义了许多宏来控制源代码版本的时候,我们自己有可能都会忘记有

没有正确的设置这些宏,

此时我们可以用这条指令在编译的时候就进行检查。假设我们希望判断自己有没有在源代码的什么地方定义了_X86这个宏,

可以用下面的方法:

#ifdef _X86

#pragma message("_X86 macro activated!")

#endif

我们定义了_X86这个宏以后,应用程序在编译时就会在编译输出窗口里显示"_86 macro activated!"。

我们就不会因为不记得自己定义的一些特定的宏而抓耳挠腮了。

(2)另一个使用得比较多的pragma参数是code_seg

格式如:

#pragma code_seg( ["section-name" [, "section-class"] ] ) 它能够设置程序中函数代码存放的代码段,当我们开发驱动程序的时候就会使用到

它。

(3)#pragma once (比较常用)

只要在头文件的最开始加入这条指令就能够保证头文件被编译一次,这条指令实际上

在VC6中就已经有了,

但是考虑到兼容性并没有太多的使用它。

(4)#pragma hdrstop

表示预编译头文件到此为止,后面的头文件不进行预编译。BCB可以预编译头文件以

加快链接的速度,

但如果所有头文件都进行预编译又可能占太多磁盘空间,所以使用这个选项排除一些头文

件。

有时单元之间有依赖关系,比如单元A依赖单元B,所以单元B要先于单元A编译。你可以用#pragma startup指定编译优先级,如果使用了#pragma package(smar t_init),

BCB就会根据优先级的大小先后编译。

(5)#pragma resource "*.dfm"

表示把*.dfm文件中的资源加入工程。*.dfm中包括窗体

外观的定义。

(6)#pragma warning( disable: 4507 34; once: 4385; error: 1 64 )

等价于:

#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和470 7)。

(7)#pragma comment(...)

该指令将一个注释记录放入一个对象文件或可执行文件中。

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

comment-type是一个预定义的标识符,指定注释的类型,应该是compiler,exestr,lib,linker之一。

comment string是一个提供为comment-type提供附加信息的字符串。

常用的lib关键字,可以帮我们连入一个库文件。如:

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

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

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

注释类型:

1、compiler:

放置编译器的版本或者名字到一个对象文件,该选项是被linker忽略的。

2、exestr:

在以后的版本将被取消。

3、lib:

放置一个库搜索记录到对象文件中,这个类型应该是和comment string(指定你要Lin ker搜索的lib的名称和路径)这个库的名字放在Object文件的默认库搜索记录的后面,linker搜索这个这个库就像你在命令行输入这个命令一样。你可以在一个源文件中设置多个库记录,它们在object文件中的顺序和在源文件中的顺序一样。如果默认库和附加库的次序是需要区别的,使用Z编译开关是防止默认库放到object模块。

我们经常用到的是#pragma comment(lib,"*.lib")这类的。#pragma comment(l ib,"Ws2_32.lib")表示链接Ws2_32.lib这个库。和在工程设置里写上链入Ws2_32.

lib的效果一样,不过这种方法写的程序别人在使用你的代码的时候就不用再设置工程s ettings了。

常用的lib关键字,可以帮我们连入一个库文件。如:

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

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

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

4、linker:

指定一个连接选项,这样就不用在命令行输入或者在开发环境中设置了。

只有下面的linker选项能被传给Linker.

1/DEFAULTLIB,/EXPORT,/INCLUDE,/MANIFESTDEPENDENCY,/MERGE,/SECTION (1) /DEFAULTLIB:library

/DEFAULTLIB 选项将一个 library 添加到 LINK 在解析引用时搜索的库列表。用 /D EFAULTLIB指定的库在命令行上指定的库之后和 .obj 文件中指定的默认库之前被搜索。忽略所有默认库 (/NODEFAULTLIB) 选项重写 /DEFAULTLIB:library。如果在两者中指定了相同的 library 名称,忽略库 (/NODEFAULTLIB:library) 选项将重写 /DE FAULTLIB:library。

(2)/EXPORT:entryname[,@ordinal[,NONAME]][,DATA]

使用该选项,可以从程序导出函数,以便其他程序可以调用该函数。也可以导出数据。通常在 DLL 中定义导出。entryname是调用程序要使用的函数或数据项的名称。ordinal 在导出表中指定范围在 1 至 65,535 的索引;如果没有指定 ordinal,则 LINK 将分配一个。NONAME关键字只将函数导出为序号,没有entryname。

DATA 关键字指定导出项为数据项。客户程序中的数据项必须用 extern __declspec(d llimport)来声明。

有三种导出定义的方法,按照建议的使用顺序依次为:

源代码中的 __declspec(dllexport).def 文件中的 EXPORTS 语句LINK 命令中的 /EXPORT 规范所有这三种方法可以用在同一个程序中。LINK 在生成包含导出的程序时还创建导入库,除非生成中使用了 .exp 文件。

LINK 使用标识符的修饰形式。编译器在创建 .obj 文件时修饰标识符。如果entrynam e以其未修饰的形式指定给链接器(与其在源代码中一样),则 LINK 将试图匹配该名称。如果无法找到唯一的匹配名称,则 LINK 发出错误信息。当需要将标识符指定给链接器时,请使用 Dumpbin 工具获取该标识符的修饰名形式。

(3)/INCLUDE:symbol

/INCLUDE 选项通知链接器将指定的符号添加到符号表。

若要指定多个符号,请在符号名称之间键入逗号 (,)、分号 (;) 或空格。在命令行上,对每个符号指定一次 /INCLUDE:symbol。

链接器通过将包含符号定义的对象添加到程序来解析 symbol。该功能对于添包含不会链接到程序的库对象非常有用。用该选项指定符号将通过 /OPT:REF 重写该符号的移除。

每个编译程序可以用#pragma指令激活或终止该编译程序支持的一些编译功能。

例如,对循环优化功能:

#pragma loop_opt(on) // 激活

#pragma loop_opt(off) // 终止

有时,程序中会有些函数会使编译器发出你熟知而想忽略的警告,

如“Parameter xxx is never used in function xxx”,可以这样:

#pragma warn —100 // Turn off the warning message f or warning #100

int insert_record(REC *r)

{ /* function body */ }

#pragma warn +100 // Turn the warning message for warning #100 back on

函数会产生一条有唯一特征码100的警告信息,如此可暂时终止该警告。

每个编译器对#pragma的实现不同,在一个编译器中有效在别的编译器中几乎无效。可从编译器的文档中查看。

#pragma disable

在函数前声明,只对一个函数有效。该函数调用过程中将不可被中断。一般在C51中使用较多。

#pragma data_seg

介绍

用#pragma data_seg建立一个新的数据段并定义共享数据,其具体格式为:

1#pragma data_seg("shareddata")

2 HWNDsharedwnd=NULL;//共享数据

3#pragma data_seg()

1,#pragma data_seg()一般用于DLL中。也就是说,在DLL中定义一个共享的有名字的数据段。最关键的是:这个数据段中的全局变量可以被多个进程共享,否则多个进程之间无法共享DLL中的全局变量。

2,共享数据必须初始化,否则微软编译器会把没有初始化的数据放到.BSS段中,从而导致多个进程之间的共享行为失败。例如,

1#pragma data_seg("MyData")

2 intg_Value;//Notethattheglobalisnotinitialized.

3#pragma data_seg()

4//DLL提供两个接口函数:

5int GetValue()

6{

7return g_Value;

8}

9void SetValue(int n)

10{

11 g_Value=n;

12 }

然后启动两个进程A和B,A和B都调用了这个DLL,假如A调用了SetValue(5); B接着调用int m = GetValue(); 那么m的值不一定是5,而是一个未定义的值。因为DLL 中的全局数据对于每一个调用它的进程而言,是私有的,不能共享的。假如你对g_Value 进行了初始化,那么g_Value就一定会被放进MyData段中。换句话说,如果A调用了S etValue(5); B接着调用int m = GetValue(); 那么m的值就一定是5,这就实现了跨进程之间的数据通信。

#pragma region

#pragma region是Visual C++中特有的预处理指令。它可以让你折叠特定的代码块,从而使界面更加清洁,便于编辑其他代码。折叠后的代码块不会影响编译。你也可以随时展开代码块以进行编辑等操作。

格式:

1#pragma region name#pragma endregion comment

使用示例如下:

1#pragma region Variables

2

3HWND hWnd;

4

5const size_t Max_Length = 20;

6

7//other variables

8

9#pragma endregion This region contains global variables.

如上边所示,需要折叠的代码必须包含在#pragma region和#pragma endregion之间。#pragma region和#pragma endregion之后可以添加一些用来注释的文字。当你折叠代码块后,这些文字会显示在折叠的位置。

折叠代码块的方法:如同Visual C++中折叠函数、类、命名空间,当代码被包含在如上

所述的指令之间后,#pragma region这一行的左边会出现一个“-”号,单击以折叠内容,同时“-”号会变成“+”号,再次单击可以展开代码块。

此预编译指令在Visual Studio 2005及以上版本可以使用。但是在Visual Studio 2005中,当#pragma region之后包含类似“1st”这类的文字,会导致“error C2059: syntax error : 'bad suffix on number'”的编译错误。避免使用数字或者将数字与字母分离可以解决这个问题。

#pragma pack

许多实际的计算机系统对基本类型数据在内存中存放的位置有限制,它们会要求这些数据的首地址的值是某个数k

(通常它为4或8)的倍数,这就是所谓的内存对齐,而这个k则被称为该数据类型的对齐模数(alignment modulus)。

Win32平台下的微软C编译器(cl.exe for 80x86)在默认情况下采用如下的对齐规则:

任何基本数据类型T的对齐模数就是T的大小,即sizeof(T)。比如对于double类型(8字节),

就要求该类型数据的地址总是8的倍数,而char类型数据(1字节)则可以从任何一个地址开始。

Linux下的GCC奉行的是另外一套规则(在资料中查得,并未验证,如错误请指正): 任何2字节大小(包括单字节吗?)的数据类型(比如short)的对齐模数是2,而其它所有超过2字节的数据类型

(比如long,double)都以4为对齐模数。

ANSI C规定一种结构类型的大小是它所有字段的大小以及字段之间或字段尾部的填充区大小之和。

填充区就是为了使结构体字段满足内存对齐要求而额外分配给结构体的空间。那么结构体本身有什么对齐要求吗?

有的,ANSI C标准规定结构体类型的对齐要求不能比它所有字段中要求最严格的那个宽松,可以更严格。

如何使用c/c++中的对齐选项

vc6中的编译选项有/Zp[1|2|4|8|16] ,/Zp1表示以1字节边界对齐,相应的,/Z pn表示以n字节边界对齐。

n字节边界对齐的意思是说,一个成员的地址必须安排在成员的尺寸的整数倍地址上或者是n的整数倍地址上,取它们中的最小值。

也就是:

min ( sizeof ( member ), n)

实际上,1字节边界对齐也就表示了结构成员之间没有空洞。

/Zpn选项是应用于整个工程的,影响所有的参与编译的结构。

要使用这个选项,可以在vc6中打开工程属性页,c/c++页,选择Code Generation 分类,在Struct member alignment可以选择。

要专门针对某些结构定义使用对齐选项,可以使用#pragma pack编译指令:

(1) #pragma pack( [ n ] )

该指令指定结构和联合成员的紧凑对齐。而一个完整的转换单元的结构和联合的紧凑对齐由/Zp 选项设置。

紧凑对齐用pack编译指示在数据说明层设置。该编译指示在其出现后的第一个结构或联合说明处生效。

该编译指示对定义无效。

当你使用#pragma pack ( n ) 时, 这里n 为1、2、4、8 或16。

第一个结构成员之后的每个结构成员都被存储在更小的成员类型或n 字节界限内。

如果你使用无参量的#pragma pack, 结构成员被紧凑为以/Zp 指定的值。该缺省/Zp

紧凑值为/Zp8 。

(2) 编译器也支持以下增强型语法:

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

若不同的组件使用pack编译指示指定不同的紧凑对齐, 这个语法允许你把程序组件组

合为一个单独的转换单元。

带push参量的pack编译指示的每次出现将当前的紧凑对齐存储到一个内部编译器堆栈中。

编译指示的参量表从左到右读取。如果你使用push, 则当前紧凑值被存储起来;

如果你给出一个n 的值, 该值将成为新的紧凑值。若你指定一个标识符, 即你选定一个名称,

则该标识符将和这个新的的紧凑值联系起来。

带一个pop参量的pack编译指示的每次出现都会检索内部编译器堆栈顶的值,并且使

该值为新的紧凑对齐值。

如果你使用pop参量且内部编译器堆栈是空的,则紧凑值为命令行给定的值, 并且将产生一个警告信息。

若你使用pop且指定一个n的值, 该值将成为新的紧凑值。若你使用p o p 且指定一个标识符,

所有存储在堆栈中的值将从栈中删除, 直到找到一个匹配的标识符, 这个与标识符相关的

紧凑值也从栈中移出,

并且这个仅在标识符入栈之前存在的紧凑值成为新的紧凑值。如果未找到匹配的标识符,

将使用命令行设置的紧凑值, 并且将产生一个一级警告。缺省紧凑对齐为8 。

pack编译指示的新的增强功能让你编写头文件, 确保在遇到该头文件的前后的

紧凑值是一样的。

(3) 栈内存对齐

在vc6中栈的对齐方式不受结构成员对齐选项的影响。它总是保持对齐,而且对齐在4字节边界上。

在网络协议编程中,经常会处理不同协议的数据报文。一种方法是通过指针偏移的方法来得到各种信息,但这样做不仅编程复杂,而且一旦协议有变化,程序修改起来也比较麻烦。在了解了编译器对结构空间的分配原则之后,我们完全可以利用这一特性定义自己的协议结构,通过访问结构的成员来获取各种信息。这样做,不仅简化了编程,而且即使协议发生变化,我们也只需修改协议结构的定义

即可,其它程序无需修改,省时省力。下面以TCP协议首部为例,说明如何定

义协议结构。

其协议结构定义如下:

1#pragma pack(1)//按照1字节方式进行对齐

2struct TCPHEADER

3{

4shortSrcPort;//16位源端口号

5shortDstPort;//16位目的端口号

6intSerialNo;//32位序列号

7intAckNo;//32位确认号

8unsignedcharHaderLen:4;//4位首部长度

9unsignedcharReserved1:4;//保留16位中的4位

10unsignedcharReserved2:2;//保留16位中的2位

11unsignedcharURG:1;

12unsignedcharACK:1;

13unsignedcharPSH:1;

14unsignedcharRST:1;

15unsignedcharSYN:1;

16unsignedcharFIN:1;

17shortWindowSize;//16位窗口大小

18shortTcpChkSum;//16位TCP检验和

19shortUrgentPointer;//16位紧急指针

20};

21#pragm apop()//取消1字节对齐方式

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

“的、地、得”用法分析及练习(后附答案)

“的、地、得”用法分析及练习(后附答案) 一、的、地、得用法分析: “的”后面跟的都是表示事物名称的词或词语,如:敬爱的总理、慈祥的老人、戴帽子的男孩、珍贵的教科书、鸟的天堂、伟大的祖国、有趣的情节、优雅的环境、可疑的情况、团结友爱的集体、他的妈妈、可爱的花儿、谁的橡皮、清清的河水...... “地”后面跟的都是表示动作的词或词语,如:高声地喊、愉快地唱、拼命地逃、疯狂地咒骂、严密地注视、一次又一次地握手、迅速地包围、沙沙地直响、斩钉截铁地说、从容不迫地申述、用力地踢、仔细地看、开心地笑笑......” “得”前面多数是表示动作的词或词语,少数是形容词;后面跟的都是形容事物状态的词或词语,表示怎么怎么样的,如:走得很快、踩得稀烂、疼得直叫唤、瘦得皮包骨头、红得发紫、气得双脚直跳、理解得十分深刻、乐得合不拢嘴、惊讶得目瞪口呆、大得很、扫得真干净、笑得多甜啊...... 二、的、地、得用法补充说明: 1、如果“de”的后面是“很、真、太”等这些词,十有八九用“得”。 2、有一种情况,如“他高兴得一蹦三尺高”这句话里,后面的“一蹦三尺高”虽然是表示动作的,但是它是来形容“高兴”的程度的,所以也应该用“得”。

三、的、地、得用法总结: 1、“的”前面的词语一般用来修饰、限制“的”后面的事物,说明“的”后面的事物怎么样。结构形式一般为:修饰、限制的词语+的+名词。 2、“地”前面的词语一般用来形容“地”后面的动作,说明“地”后面的动作怎么样。结构方式一般为:修饰、限制的词语+地+动词。 3、“得”后面的词语一般用来补充说明“得”前面的动作怎么样,结构形式一般为:动词(形容词)+得+补充、说明的词语。 四、的、地、得用法例句: 1. 蔚蓝色的海洋,波涛汹涌,无边无际。 2. 向日葵在微风中向我们轻轻地点头微笑。 3. 小明在海安儿童公园玩得很开心。 五、“的、地、得”的读音: “的、地、得”是现代汉语中高频度使用的三个结构助词,都起着连接作用;它们在普通话中都各自有着各自的不同的读音,但当他们附着在词,短语,句子的前面或后面,表示结构关系或某些附加意义的时候都读轻声“de”,没有语音上的区别。 但在书面语中有必要写成三个不同的字,这样可以区分他们在书面语用法上的不同。这样做的好处,就是可使书面语言精确化。

英语 花费 四种用法的区别

spend的主语必须是人,常用于以下结构: (1)sb. spend time /money on sth. 在……上花费时间(金钱)。 (2) sb.spend time / money (in) doing sth.花费时间(金钱)做某事。 例:I spent fifty yuan on the coat. = I spent fifty yuan (in) buying the coat. 我花50元买了这件大衣。 He spent three days on the work. = He spend three days (in) doing the work. 我干这项工作用了3天。 (3). spend money for sth. 花钱买 例如: His money was spent for books. 他的钱用来买书了。 cost的主语是物或某种活动,还可以表示"值",常见用法如下: (1)sth. costs (sb.) +金钱,某物花了(某人)多少钱。 例:A new computer costs a lot of money. 买一台新电脑要花一大笔钱。 (2) (doing) sth. costs (sb.) +时间,某物(做某事)花了(某人)多少时间。 例:Remembering these new words cost him a lot of time. 他花了大量时间才记住了这些单词。 注意:cost的过去式及过去分词都是cost,并且不能用于被动句。 take后面常跟双宾语,常见用法有以下几种: (1) It takes sb. +时间+to do sth. 做某事花了某人多少时间。 例:It took them three years to build this road. 他们用了三年时间修完了这条路。 (2)doing sth. takes sb. +时间,做某事花了某人多少时间。 例:Repairing this car took him the whole afternoon. 他花了一下午修车。 pay的基本用法是: (1) pay (sb.) money for sth. 付钱(给某人)买……。 例:I have to pay them 20 pounds for this room each month. 我每个月要付20英磅的房租。 (2)pay for sth. 付……的钱。 例:I have to pay for the book lost. 我不得不赔丢失的书款。 (3)pay for sb.替某人付钱。 例:Don‘t worry!I'll pay for you. 别担心,我会给你付钱的。 (4)pay sb.付钱给某人。 例: They pay us every month.他们每月给我们报酬。 (5)pay money back 还钱。(6)pay off one's money还清钱。 例:May I borrow 12 yuan from you? I'll pay it back next week. 你能借给我12块钱吗?下周还你。

四种花费和四种提供的用法

英语中“花费”的四种用法王朝红的工作室英语花费四种用法 spend的主语通常是人,往往用于以下句型: 1. (sb) spend some money/some time on sth。 2. (sb)spend some money/some time(in)doing sth。 例如: I spent fifty yuan on the coat。 = I spent fifty yuan (in) buying the coat. 我花50元买了这件大衣。 He spent three days on the work. = He spend three days (in) doing the work. 我干这项工作用了3天。 3.spend money for sth. 花钱买……。 例如:His money was spent for books. 他的钱用来买书了。 take常用于“占用、花费”时间,后面常跟双宾语,其主语通常为形式主语“it”或物。句式是: 1. It takes/took sb.some time to do sth 例如:It will take me two days to do the work. 这项工作花了2天时间。 2. Doing sth./Sth.takes sb.some time. 例如: The work will take me two days。这项工作花了2天时间。

Repairing this car took him the whole afternoon. 他花了一下午修车。 It took me three years to draw the beautiful horses。 =Drawing the beautiful horses took me three years。 画这些漂亮的马花费了我3年时间。 pay为“付款、赔偿”之意,主语通常是人,句型 1. sb. pays some money for sth 例如: I paid fifty yuan for the coat。我花50元买了这件大衣。 2. pay (sb。) money for sth. 付钱(给某人)买……。 例如:I have to pay them 20 pounds for this room each month. 我每个月要付20英磅的房租。 3. pay money back 还钱。 例如:May I borrow 12 yuan from you? I'll pay it back next week. 你能借给我12块钱吗?下周还你。 4. pay off one's money 还清钱。 cost的主语是物或某种活动,还可以表示“值”。句型 1. sth. costs (sb。) +money, 某物花了(某人)多少钱。

C++ #pragma code_seg用法

#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() { } 例如 #pragma code_seg(“PAGE”) 作用是将此部分代码放入分页内存中运行。 #pragma code_seg() 将代码段设置为默认的代码段 #pragma code_seg("INIT") 加载到INIT内存区域中,成功加载后,可以退出内存

“四个花费”spend,cost,take, pay讲解及对应中考练习

“四个花费”讲解及对应中考练习 spend,cost,take, pay spend,cost,take和pay的区别是历年考试的必考内容之一,虽然它们都可以表示"花费",但用法却不尽相同,讲解如下: spend的主语必须是人,常用于以下结构: (1) spend time /money on sth. 在……上花费时间(金钱)。 例:I spent two hours on this maths problem. 这道数学题花了我两个小时。 (2) spend time /money (in) doing sth. 花费时间(金钱)做某事。 例:They spent two years (in) building this bridge. 造这座桥花了他们两年时间。 (3)spend money for sth. 花钱买……。 例:His money was spent for books. 他的钱用来买书了。 cost的主语是物或某种活动,还可以表示"值",常见用法如下: (1)sth. costs (sb.) +金钱,某物花了(某人)多少钱。 例:A new computer costs a lot of money. 买一台新电脑要花一大笔钱。 (2) (doing) sth. costs (sb.) +时间,某物(做某事)花了(某人)多少时间。 例:Remembering these new words cost him a lot of time. 他花了大量时间才记住了这些单词。 注意:cost的过去式及过去分词都是cost,并且不能用于被动句。 take后面常跟双宾语,常见用法有以下几种: (1) It takes sb. +时间+to do sth. 做某事花了某人多少时间。 例:It took them three years to build this road. 他们用了三年时间修完了这条路。 (2)doing sth. takes sb. +时间,做某事花了某人多少时间。 例:Repairing this car took him the whole afternoon. 他花了一下午修车。 pay的基本用法是: (1) pay (sb.) money for sth. 付钱(给某人)买……。 例:I have to pay them 20 pounds for this room each month. 我每个月要付20英磅的房租。 (2)pay for sth. 付……的钱。 例:I have to pay for the book lost. 我不得不赔丢失的书款。 (3)pay for sb. 替某人付钱。 例:Don‘t worry!I'll pay for you. 别担心,我会给你付钱的。 (4)pay sb. 付钱给某人。 例: They pay us every month.他们每月给我们报酬。 (5)pay money back 还钱。 例:May I borrow 12 yuan from you? I'll pay it back next week. 你能借给我12块钱吗?下周还你。 (6)pay off one's money还清钱。 【真题对应练习】 1.(广州某校2015期中)--- How much does your new bike ___________ ?

四种花费和四种提供的用法

四种花费和四种提供的 用法 公司内部编号:(GOOD-TMMT-MMUT-UUPTY-UUYY-DTTI-

英语中“花费”的四种用法王朝红的工作室英语花费四种用法 spend的主语通常是人,往往用于以下句型: 1. (sb) spend some money/some time on sth。 2. (sb)spend some money/some time(in)doing sth。 例如: I spent fifty yuan on the coat。 = I spent fifty yuan (in) buying the coat. 我花50元买了这件大衣。 He spent three days on the work. = He spend three days (in) doing the work. 我干这项工作用了3天。 3.spend money for sth. 花钱买……。 例如:His money was spent for books. 他的钱用来买书了。 take常用于“占用、花费”时间,后面常跟双宾语,其主语通常为形式主语“it”或物。句式是: 1. It takes/took sb.some time to do sth

例如:It will take me two days to do the work. 这项工作花 了2天时间。 2. Doing sth./Sth.takes sb.some time. 例如: The work will take me two days。这项工作花了2天时间。 Repairing this car took him the whole afternoon. 他花了一下午修车。 It took me three years to draw the beautiful horses。 =Drawing the beautiful horses took me three years。 画这些漂亮的马花费了我3年时间。 pay为“付款、赔偿”之意,主语通常是人,句型 1. sb. pays some money for sth 例如: I paid fifty yuan for the coat。我花50元买了这件大衣。 2. pay (sb。) money for sth. 付钱(给某人)买……。 例如:I have to pay them 20 pounds for this room each month.我每个月要付20英磅的房租。

C++ #pragma预处理命令

#pragma预处理命令 #pragma可以说是C++中最复杂的预处理指令了,下面是最常用的几个#pragma 指令: #pragma comment(lib,"XXX.lib") 表示链接XXX.lib这个库,和在工程设置里写上XXX.lib的效果一样。 #pragma comment(linker,"/ENTRY:main_function") 表示指定链接器选项/ENTRY:main_function #pragma once 表示这个文件只被包含一次 #pragma warning(disable:4705) 表示屏蔽警告4705 C和C++程序的每次执行都支持其所在的主机或操作系统所具有的一些独特的特点。例如,有些程序需要精确控制数据存放的内存区域或控制某个函数接收的参数。#pragma为编译器提供了一种在不同机器和操作系统上编译以保持C和C++完全兼容的方法。#pragma是由机器和相关的操作系统定义的,通常对每个编译器来说是不同的。 如果编译器遇到不认识的pragma指令,将给出警告信息,然后继续编译。Microsoft C and C++ 的编译器可识别以下指令:alloc_text,auto_inline,bss_seg,check_stack,code_seg,comment,component,conform,const_seg,data_seg,deprecated,fenv_access,float_control,fp_contract,function,hdrstop,include_alias,init_seg,inline_depth,inline_recursion,intrinsic,make_public,managed,message,omp,once,optimize,pack,pointers_to_members,pop_macro,push_macro,region, endregion,runtime_checks,section,setlocale,strict_gs_check,unmanaged,vtordisp,warning。其中conform,init_seg, pointers_to_members,vtordisp仅被C++编译器支持。 以下是常用的pragma指令的详细解释。 1.#pragma once。保证所在文件只会被包含一次,它是基于磁盘文件的,而#ifndef 则是基于宏的。

comparison的用法解析大全

comparison的用法解析大全 comparison的意思是比较,比喻,下面我把它的相关知识点整理给大家,希望你们会喜欢! 释义 comparison n. 比较;对照;比喻;比较关系 [ 复数 comparisons ] 词组短语 comparison with 与…相比 in comparison adj. 相比之下;与……比较 in comparison with 与…比较,同…比较起来 by comparison 相比之下,比较起来 comparison method 比较法 make a comparison 进行比较 comparison test 比较检验 comparison theorem 比较定理 beyond comparison adv. 无以伦比 comparison table 对照表 comparison shopping 比较购物;采购条件的比较调查 paired comp arison 成对比较 同根词 词根: comparing adj. comparative 比较的;相当的 comparable 可比较的;比得上的 adv. comparatively 比较地;相当地 comparably 同等地;可比较地 n.

comparative 比较级;对手 comparing 比较 comparability 相似性;可比较性 v. comparing 比较;对照(compare的ing形式) 双语例句 He liked the comparison. 他喜欢这个比喻。 There is no comparison between the two. 二者不能相比。 Your conclusion is wrong in comparison with their conclusion. 你们的结论与他们的相比是错误的。 comparison的用法解析大全相关文章: 1.by的用法总结大全

四种花费用法讲解

Take\spend\pay\cost表示花费的时候用法1、It takes sb some time to do sth. 该句型只表示花费时间,it是形式主语,真正的主语是动词不定式。sb是宾格形式,some time 是一段时间。 Eg: a.It took the boys two weeks to plant the trees last spring. b.It takes me ten minutes to walk to school every day. c.It will take us about 30 minutes to finish listening the story. 2. Sb spends some time/money (in) doing sth. Sb spends some time/money on sth. 该句型可表示花费时间,也可以表示花费金钱。主语必定是人,做某事可以用动词表示,也可用名词表示。 d.We spent the whole day going hiking in Mount Tai last summer. e.Did you spend ten yuan on the pen? f.All the boys spent about five minutes

remembering the ten English words. 除此之外,还有pay和cost也可以表示花费金钱。 Pay 常用for连用,构成pay for 意思是赔尝、付款。主语必须是人。 I paid for the book yesterday. 昨天我买了这本书。 I paid ten yuan for the book yesterday. 昨天我花了十元钱买了这本书。 You should pay for the book if you lose it. 如果你丢了这本书,你就应该赔偿。 Cost 表示值多少钱,也表示花费。 The magazine costs twenty yuan. The bicycle cost me eight hundred and fifty yuan.

#pragma data code ICCAVR的使用

#pragma data:code 在Keil中为了节省数据存储器的空间,通过“code”关键字来定义一个数组或字符串将被存储在程序存储器中: uchar code buffer[]={0,1,2,3,4,5}; uchar code string[]="Armoric" ; 而这类代码移值到ICCAVR上时是不能编译通过的。我们可以通过"const" 限定词来实现对存储器的分配: #pragma data:code const unsigned char buffer[]={0,1,2,3,4,5}; const unsigned char string[]="Armoric"; #pragma data:data 注意: 《1》使用ICCAVR6.31时,#pragma data :code ;#pragma data:data ; 这些语法时在"data:cod"、"data:data"字符串中间不能加空格,否则编译不能通过。 《2》const 在ICCAVR是一个扩展关键词,它与ANSIC标准有冲突,移值到其它的编译器使用时也需要修改相关的地方。 在ICCAVR中对数组和字符串的五种不同空间分配: const unsigned char buffer[]={0,1,2,3,4,5}; //buffer数组被分配在程序存储区中 const unsigned char string[]="Armoric" ; //stringp字符串被分配在程序存储区中 const unsigned char *pt //指针变量pt被分配在数据存储区中,指向程序存储区中的字符类型数据 unsigned char *const pt //指针变量pt被分配在程序存储区中,指向数据存储区中的字符类型数据 const unsigned char *const pt //指针变量pt被分配在程序存储区,指向程序存储区中的字符类型数据 unsigned char *pt //指针变量pt被分配在数据存储区中,指向数据存储区中的数据 请问#pragma data:code和#pragma data:data是什么意思? 前者表示:随后的数据将存贮在程序区,即FLASH区,此区只能存贮常量,比如表格之类。

标点符号用法分析

标点符号用法 一、标点符号 标点符号:辅助文字记录语言的符号,是书面语的有机组成部分,用来表示语句的停顿、语气以及标示某些成分(主要是词语)的特定性质和作用。 句子:前后都有较大停顿、带有一定的语气和语调、表达相对完整意义的语言单位。 复句:由两个或多个在意义上有密切关系的分句组成的语言单位,包括简单复句(内部只有一层语义关系)和多重复句(内部包含多层语义关系)。 分句:复句内两个或多个前后有停顿、表达相对完整意义、不带有句末语气和语调、有的前面可添加关联词语的语言单位。 陈述句:用来说明事实的句子。 祈使句:用来要求听话人做某件事情的句子。 疑问句:用来提出问题的句子。 感叹句:用来抒发某种强烈感情的句子。 词语:词和短语(词组)。词,即最小的能独立运用的语言单位。短语,即由两个或两个以上的词按一定的语法规则组成的表达一定意义的语言单位,也叫词组。 二、分类 标点符号分为点号和标号两大类。

点号的作用是点断,主要表示说话时的停顿和语气。点号又分为句末点号和句内点号。 句末点号用在句末,表示句末停顿和句子的语气,包括句号、问号、叹号。 句内点号用在句内,表示句内各种不同性质的停顿,有逗号、顿号、分号、冒号。 标号的作用是标明,主要标示某些成分(主要是词语)的特定性质和作用。包括引号、括号、破折号、省略号、着重号、连接号、间隔号、书名号、专名号、分隔号。 (一)句号 1.用于句子末尾,表示陈述语气。使用句号主要根据语段前后有较大停顿、带有陈述语气和语调,并不取决于句子的长短。 2.有时也可表示较缓和的祈使语气和感叹语气。 请您稍等一下。 我不由地感到,这些普通劳动者也是同样值得尊敬的。 (二)问号 主要表示句子的疑问语气。形式是“?”。 1.用于句子末尾,表示疑问语气(包括反问、设问等疑问类型)。使用问号主要根据语段前后有较大停顿、带有疑问语气和语调,并不取决于句子的长短。 2.选择问句中,通常只在最后一个选项的末尾用问号,各个选项之间一般用逗号隔开。当选项较短且选项之间几乎没有停顿时,选项之间可不用逗号。当选项较多或较长,或有意突出每个选项的独立性时,也可每个选项之后都用问号。 3.问号也有标号的用法,即用于句内,表示存疑或不详。 马致远(1250?―1321)。 使用问号应以句子表示疑问语气为依据,而并不根据句子中包含有疑问词。当含有疑问词的语段充当某种句子成分,而句子并不表示疑问语气时,句末不用问号。

虚词“了”的用法分析

虚词“了”的用法分析 摘要:现代汉语中,虚词“了(le)”不论是在口语中,还是书面语中,使用频 率都比较高。虚词“了”有两个,语气词“了”和助词“了”。两者字形、读音相同,但具体用法和语法作用却不相同。 关键字: 虚词“了”、语气词、助词、具体用法、语法作用 正文: 注意:语气词“了”和助词“了”可同在句末。且都在句子末尾,可能是助词“了”,也有可能是语气词“了”,但意思有区别。 如:她写了。(“了”若是语气词,则表示动作在进行,若“了”是助词,则表示动作已经完成) 一、助词“了”。 1.紧跟在动词之后,表示动作的完成。 如:1)王春生从来没有忘了他爹的惨死跟妈的眼泪。(周立波《暴风骤雨》) 2)还没有等到发榜,全国高校统考开始了,我当然还应该参1《谈谈句末的“了”》张兰英-《东岳丛林》-2005

加。(余秋雨《霜冷长河》) 也可以表示将要发生的事情或假设可能发生的事情的完成。如:跟他们谈话就是我的工作,你要有什么话等我闲了再谈吧。(《赵树理选集》) 2.如果动词之后紧跟着另外一个动词或形容词作补语时,“了”就放在了补语之后。 如:1) "祥哥!"她往前凑了凑,"我把东西都收拾好了。"(老舍《骆驼祥子》) 2)他决定去拉车,就拉车去了。(老舍《骆驼祥子》) 3) 整整的三年,他凑足了一百块钱!(老舍《骆驼祥子》) 3. “了”放在由两个动词构成的并列词组后面(表示两个动词同时或者连续完成)。 如:这项政策的实施进一步巩固和加强了海内外中华儿女大团结。 4. 连谓句、兼语句中,助词“了”一般用在后一动词之后2。如:她找我借了两本书。连谓句强调前一动作完成后才开始后一动作时,兼语句前一动作完成时,助词“了”可在前一动词后。如:临时组织了一些人去支援五车间。 5. 有些动词后面的助词“了”表示动作有了结果,即加在动词后面的“掉”很相似。这类动词有:泼、扔、放、碰、砸、捧、磕、撞、踩、伤、杀、宰、切、冲、卖、还、毁、忘、丢、关、喝、吃、咽、吞、涂、抹、擦等。这个意义的“了”可以用在命令句和‘把’字句。2吕叔湘《现代汉语八百词》(1981商务印书馆)第315页。

四种花费和四种提供的用法

四种花费和四种提供的 用法 Revised as of 23 November 2020

英语中“花费”的四种用法王朝红的工作室英语花费四种用法 spend的主语通常是人,往往用于以下句型: 1. (sb) spend some money/some time on sth。 2. (sb)spend some money/some time(in)doing sth。 例如: I spent fifty yuan on the coat。 = I spent fifty yuan (in) buying the coat. 我花50元买了这件大衣。 He spent three days on the work. = He spend three days (in) doing the work. 我干这项工作用了3天。 money for sth. 花钱买……。 例如:His money was spent for books. 他的钱用来买书了。 take常用于“占用、花费”时间,后面常跟双宾语,其主语通常为形式主语“it”或物。句式是: 1. It takes/took time to do sth

例如:It will take me two days to do the work.这项工作花了2天时间。 2. Doing sth./ time. 例如: The work will take me two days。这项工作花了2天时间。 Repairing this car took him the whole afternoon. 他花了一下午修车。 It took me three years to draw the beautiful horses。 =Drawing the beautiful horses took me three years。 画这些漂亮的马花费了我3年时间。 pay为“付款、赔偿”之意,主语通常是人,句型 1. sb. pays some money for sth 例如: I paid fifty yuan for the coat。我花50元买了这件大衣。 2. pay (sb。) money for sth. 付钱(给某人)买……。 例如:I have to pay them 20 pounds for this room each month. 我每个月要付20英磅的房租。 3. pay money back 还钱。

pragma的用法

#pragma的用法 在所有的预处理指令中,#Pragma 指令可能是最复杂的了,它的作用是设定编译器的状态或者是指示编译器完成一些特定的动作。#pragma指令对每个编译器给出了一个方法,在保持与C和C++语言完全兼容的情况下,给出主机或操作系统专有的特征。依据定义, 编译指示是机器或操作系统专有的,且对于每个编译器都是不同的。 其格式一般为: #pragma para。其中para为参数,下面来看一些常用的参数。 1)message 参数 message参数是我最喜欢的一个参数,它能够在编译信息输出窗口中输出相应的信息,这对于源代码信息的控制是非常重要的。其使用方法为: #pragma message("消息文本") 当编译器遇到这条指令时就在编译输出窗口中将消息文本打印出来。 当我们在程序中定义了许多宏来控制源代码版本的时候,我们自己有可能都会忘记有 没有正确的设置这些宏, 此时我们可以用这条指令在编译的时候就进行检查。假设我们希望判断自己有没有在源代码的什么地方定义了_X86这个宏, 可以用下面的方法: #ifdef _X86 #pragma message("_X86 macro activated!") #endif 我们定义了_X86这个宏以后,应用程序在编译时就会在编译输出窗口里显示"_86 macro activated!"。 我们就不会因为不记得自己定义的一些特定的宏而抓耳挠腮了。 (2)另一个使用得比较多的pragma参数是code_seg 格式如: #pragma code_seg( ["section-name" [, "section-class"] ] ) 它能够设置程序中函数代码存放的代码段,当我们开发驱动程序的时候就会使用到 它。 (3)#pragma once (比较常用) 只要在头文件的最开始加入这条指令就能够保证头文件被编译一次,这条指令实际上 在VC6中就已经有了, 但是考虑到兼容性并没有太多的使用它。 (4)#pragma hdrstop 表示预编译头文件到此为止,后面的头文件不进行预编译。BCB可以预编译头文件以 加快链接的速度, 但如果所有头文件都进行预编译又可能占太多磁盘空间,所以使用这个选项排除一些头文

定语从句用法分析

定语从句用法分析 定语从句在整个句子中担任定语,修饰一个名词或代词,被修饰的名词或代词叫先行词。定语从句通常出现在先行词之后,由关系词(关系代词或关系副词)引出。 eg. The boys who are planting trees on the hill are middle school students 先行词定语从句 #1 关系词: 关系代词:who, whom, whose, that, which, as (句子中缺主要成份:主语、宾语、定语、表语、同位语、补语), 关系副词:when, where, why (句子中缺次要成份:状语)。 #2 关系代词引导的定语从句 关系代词引导定语从句,代替先行词,并在句中充当主语、宾语、定语等主要成分。 1)who, whom, that 指代人,在从句中作主语、宾语。 eg. Is he the man who/that wants to see you?(who/that在从句中作主语) ^ He is the man who/whom/ that I saw yesterday.(who/whom/that在从句中作宾语) ^ 2)whose 用来指人或物,(只用作定语, 若指物,它还可以同of which互换)。eg. They rushed over to help the man whose car had broken down. Please pass me the book whose cover is green. = the cover of which/of which the cover is green. 3)which, that指代物,在从句中可作主语、宾语。 eg. The package (which / that)you are carrying is about to come unwrapped. ^ (which / that在从句中作宾语,可省略) 关系代词在定语从句中作主语时,从句谓语动词的人称和数要和先行词保持一致。 eg. Is he the man who want s to see you? #3.关系副词引导的定语从句 关系副词when, where, why引导定语从句,代替先行词(时间、地点或理由),并在从句中作状语。 eg. Two years ago, I was taken to the village where I was born. Do you know the day when they arrived? The reason why he refused is that he was too busy. 注意: 1)关系副词常常和"介词+ which"结构互换 eg. There are occasions when (on which)one must yield (屈服). Beijing is the place where(in which)I was born. Is this the reason why (for which)he refused our offer? * 2)在非正式文体中,that代替关系副词或"介词+ which",放在时间、地点、理由的名词,在口语中that常被省略。 eg. His father died the year (that / when / in which)he was born. He is unlikely to find the place (that / where / in which)he lived forty years ago.

stm32中使用#pragma pack(非常有用的字节对齐用法说明)

#pragma pack(4) //按4字节对齐,但实际上由于结构体中单个成员的最大占用字节数为2字节,因此实际还是按2字节对齐 typedef struct { char buf[3];//buf[1]按1字节对齐,buf[2]按1字节对齐,由于buf[3]的下一成员word a是按两字节对齐,因此buf[3]按1字节对齐后,后面只需补一空字节 word a; //#pragma pack(4),取小值为2,按2字节对齐。 }kk; #pragma pack() //取消自定义字节对齐方式 对齐的原则是min(sizeof(word ),4)=2,因此是2字节对齐,而不是我们认为的4字节对齐。 这里有三点很重要: 1.每个成员分别按自己的方式对齐,并能最小化长度 2.复杂类型(如结构)的默认对齐方式是它最长的成员的对齐方式,这样在成员是复杂类型时,可以最小化长度 3.对齐后的结构体整体长度必须是成员中最大的对齐参数的整数倍,这样在处理数组时可以保证每一项都边界对齐 补充一下,对于数组,比如: char a[3];这种,它的对齐方式和分别写3个char是一样的.也就是说它还是按1个字节对齐. 如果写: typedef char Array3[3]; Array3这种类型的对齐方式还是按1个字节对齐,而不是按它的长度. 不论类型是什么,对齐的边界一定是1,2,4,8,16,32,64....中的一个. 声明: 整理自网络达人们的帖子,部分参照MSDN。 作用: 指定结构体、联合以及类成员的packing alignment; 语法: #pragma pack( [show] | [push | pop] [, identifier], n ) 说明: 1,pack提供数据声明级别的控制,对定义不起作用; 2,调用pack时不指定参数,n将被设成默认值; 3,一旦改变数据类型的alignment,直接效果就是占用memory的减少,但是performance会下降; 语法具体分析: 1,show:可选参数;显示当前packing aligment的字节数,以warning message的形式被显示; 2,push:可选参数;将当前指定的packing alignment数值进行压栈操作,这里的栈是the internal compiler stack,同时设置当前的packing alignment为n;如果n没有指定,则将当前的packing alignment数值压栈; 3,pop:可选参数;从internal compiler stack中删除最顶端的record;如果没有指定n,则当前栈顶record即为新的packing alignment 数值;如果指定了n,则n将成为新的packing aligment数值;如果指定了identifier,则internal compiler stack中的record都将被pop 直到identifier被找到,然后pop出identitier,同时设置packing alignment数值为当前栈顶的record;如果指定的identifier并不存在于internal compiler stack,则pop操作被忽略; 4,identifier:可选参数;当同push一起使用时,赋予当前被压入栈中的record一个名称;当同pop一起使用时,从internal compiler stack 中pop出所有的record直到identifier被pop出,如果identifier没有被找到,则忽略pop操作; 5,n:可选参数;指定packing的数值,以字节为单位;缺省数值是8,合法的数值分别是1、2、4、8、16。 重要规则: 1,复杂类型中各个成员按照它们被声明的顺序在内存中顺序存储,第一个成员的地址和整个类型的地址相同; 2,每个成员分别对齐,即每个成员按自己的方式对齐,并最小化长度;规则就是每个成员按其类型的对齐参数(通常是这个类型的大小)和指定对齐参数中较小的一个对齐; 3,结构体、联合体或者类的数据成员,第一个放在偏移为0的地方;以后每个数据成员的对齐,按照#pragma pack指定的数值和这个数据成员自身长度两个中比较小的那个进行;也就是说,当#pragma pack指定的值等于或者超过所有数据成员长度的时候,这个指定值的大小将不产生任何效果; 4,复杂类型(如结构体)整体的对齐是按照结构体中长度最大的数据成员和#pragma pack指定值之间较小的那个值进行;这样当数据成员为复杂类型(如结构体)时,可以最小化长度; 5,复杂类型(如结构体)整体长度的计算必须取所用过的所有对齐参数的整数倍,不够补空字节;也就是取所用过的所有对齐参数中最大的那个值的整数倍,因为对齐参数都是2的n次方;这样在处理数组时可以保证每一项都边界对齐; 对齐的算法:由于各个平台和编译器的不同,现以本人使用的gcc version 3.2.2编译器(32位x86平台)为例子,来讨论编译器对struct 数据结构中的各成员如何进行对齐的。 在相同的对齐方式下,结构体内部数据定义的顺序不同,结构体整体占据内存空间也不同,如下: 设结构体如下定义: struct A { int a; //a的自身对齐值为4,偏移地址为0x00~0x03,a的起始地址0x00满足0x00%4=0;

相关文档