#pragma详解(三)

 

8 component

#pragma component( browser, { on | off }[, references [, name ]] )

#pragma component( minrebuild, on | off )

从源文件内控制浏览信息和依赖信息的收集。

8-1 浏览信息(Browser

你可以将收集打开或关闭,你也可以指定收集时忽略特别的名字。

使用onoff在编译指示以后控制浏览信息的收集。例如:

#pragma component(browser, off)

终止编译程序收集浏览信息。

注意,为了用这个编译指示打开浏览信息的收集,必须先从Project Setting对话框或者命令行允许浏览信息。

references选项可以有也可以没有name参数。使用没有name参数的references选项将打开或者关闭引用信息的收集(然而继续收集其它浏览信息)。例如:

#pragma component(browser, off, references)

终止编译程序收集引用信息。

使用有nameoff参数的references选项将阻止从浏览信息窗口中出现引用到的名字。用这个语法将忽略你不感兴趣的名字和类型从而减少浏览信息文件的大小。例如:

#pragma component(browser, off, references, DWORD)

从这一点以后忽略DWORD的引用。你能够用on恢复DWORD的引用收集:

#pragma component(browser, on, references, DWORD)

这是唯一的方法可以恢复收集指定名字的引用,你必须显式地打开任何你关闭的名字。

为了防止预处理程序扩展名字(就像扩展NULL0),用引号括起来:

#pragma component(browser, off, references, "NULL")

8-2 最小化重建(Minimal Rebuild

Visual C++的最小化重建功能要求编译程序创建并保存需要大量磁盘空间的C++类依赖信息。为了节省磁盘空间,你能够在你不需要收集依赖信息时使用#pragma component(minrebuild,off),例如,没有改变过头文件。在未修改过的类之后插入#pragma component(minrebuild,on)重新打开依赖信息。

详见Enable Minimal Rebuild(/Gm)编译程序选项。

9 data_seg

#pragma data_seg( ["section-name"[, "section-class"] ] )

指定数据的默认段。例如:

#pragma data_seg( "MY_DATA" )

导致在#pragma语句后分配的数据保存在一个叫做MY_DATA的段中。

data_seg编译指示分配的数据不包含任何关于其位置的信息。

第二个参数section-class是用于兼容2.0版本以前的Visual C++的,现在将忽略它。

10 function

#pragma function( function1 [, function2, ...] )

指定必须生成对编译指示中参数列表内函数的调用。如果你使用intrinsic编译指示(或者/Oi)来告诉编译程序生成内含函数(内含函数如同嵌入代码一样生成,不作为一个函数调用),你能够用function编译指示显式地强迫函数调用。当遇到一个function编译指示,它将在其后面遇到的第一个包含有内含函数的函数定义处生效。其持续作用到源文件的尾部或者出现对同一个内含函数指定intrinsic编译指示。function编译指示只能用于函数外——在全局层次。

为了列出具有内含形式的函数表,参见#pragma intrinsic

11 hdrstop

#pragma hdrstop [( "filename" )]

控制预编译头文件的工作方式。filename是要使用或者创建(依赖于是否指定了/Yu/Yc)预编译头文件的名字。如果 filename不包括一个指定路径,将假定预编译头文件和源文件处于同一个目录中。当指定自动预编译头文件选项/YX时,所有指定的文件名将被忽略。

如果有/YX或者/Yc选项,而且CC++文件包含了一个hdrstop编译指示时,编译程序保存编译指示之前的编译状态。编译指示之后的编译状态不被保存。

hdrstop编译选项不能出现在一个头文件内。它只能出现在源文件的文件级,它也不能出现在任何数据或者函数的说明或定义之中。

注意,除非指定没有文件名的/YX选项或者/Yu/Yc选项,否则hdrstop编译指示将被忽略。

用一个文件名命名要保存编译状态的预编译头文件。在hdrstopfilename之间的空格是可选的。在hdrstop编译指示中的文件名是一个字符串,这样它服从于CC++的字符串规则。特别的,你必须像下面例子里面显示的用引号括起来。

#pragma hdrstop( "c:\projects\include\myinc.pch" )

预编译头文件的文件名按照如下规则决定,按照优先次序:

/Fp编译程序选项的参数;

#pragma hdrstopfilename参数;

原文件名的基本文件名加上.PCH扩展名。

12 include_alias

#pragma include_alias( "long_filename", "short_filename" )

#pragma include_alias( <long_filename>, <short_filename> )

指定作为long_filename别名的short_filename。一些文件系统允许超出8.3FAT文件系统限制的长头文件名。编译程序不能简单地将长文件名截断为8.3名字,因为长头文件名的前8个字符可能不是唯一的。无论何时编译程序遇到long_filename串,它代替short_filename,并且用short_filename搜索头文件。这个编译指示必须出现在相应的#include指示之前。例如:

// First eight characters of these two files not unique.

#pragma include_alias( "AppleSystemHeaderQuickdraw.h", "quickdra.h" )

#pragma include_alias( "AppleSystemHeaderFruit.h", "fruit.h" )

#pragma include_alias( "GraphicsMenu.h", "gramenu.h" )

#include "AppleSystemHeaderQuickdraw.h"

#include "AppleSystemHeaderFruit.h"

#include "GraphicsMenu.h"

这个别名在搜索时精确匹配,包括拼写和双引号、尖括号。include_alias编译指示在文件名上执行简单的字符串匹配,不进行其它的文件名验证。例如,给出下列指示:

#pragma include_alias("mymath.h", "math.h")

#include "./mymath.h"

#include "sys/mymath.h"

并不执行别名替代,因为头文件名字符串没有精确匹配。另外,在/Yu/Yc/YX编译程序选项,或hdrstop编译指示中作为参数的头文件名不被替换。例如,如果你的源文件包含下列指示:

#include <AppleSystemHeaderStop.h>

相应的编译程序选项必须是:

/YcAppleSystemHeaderStop.h

你能够用include­_alias编译指示将任何头文件映射到其它文件。例如:

#pragma include_alias( "api.h", "c:\version1.0\api.h" )

#pragma include_alias( <stdio.h>, <newstdio.h> )

#include "api.h"

#include <stdio.h>

不要混淆用双引号和尖括号括起来的文件名。例如,给出上面的#pragma include_alias指示时,在下面的#include指示中编译程序不执行替换。

#include <api.h>

#include "stdio.h"

还有,下面的指示将产生一个错误:

#pragma include_alias(<header.h>, "header.h") // Error

注意,在错误信息中报告的文件名,或者预定义宏__FILE__的值,是执行替换以后的文件名。例如,在下列指示之后:

#pragma include_alias( "VeryLongFileName.H", "myfile.h" )

#include "VeryLongFileName.H"

文件VeryLongFileName.H产生下列错误信息:

myfile.h(15) : error C2059 : syntax error

还要注意的是不支持传递性。给出下面的指示:

#pragma include_alias( "one.h", "two.h" )

#pragma include_alias( "two.h", "three.h" )

#include "one.h"

编译程序将搜索two.h而不是three.h

13 init_seg

C++特有

#pragma init_seg({ compiler | lib | user | "section-name" [, "func-name"]} )

指定影响启动代码执行的关键字或代码段。因为全局静态对象的初始化可以包含执行代码,所以你必须指定一个关键字来定义什么时候构造对象。在使用需要初始化的动态连接库(DLL)或程序库时使用init_seg编译指示是尤其重要的。

init_seg编译指示的选项有:

13-1 compiler

Microsoft C运行时间库保留。在这个组中的对象将第一个构造。

13-2 lib

用于第三方类库开发者的初始化。在这个组中的对象将在标记为构造compiler的对象之后,其它对象之前构造。

13-3 user

用于任何其它用户。在这个组中的对象将最后构造。

13-4 section-name

允许显式地指定初始化段。在用户指定的section-name中的对象将不会隐式地构造,而它们的地址将会被放置在由section-name命名的段中。

13-5 func-name

指定当程序退出时,作为atexit函数调用的函数。这个函数必须具有和atexit函数相同的形式:

int funcname(void (__cdecl *)(void));

如果你需要延迟初始化,你能够选择指定显式的段名。随后你必须调用每个静态对象的构造函数。

14 inline_depth

#pragma inline_depth( [0... 255] )

通过控制能够被扩展的一系列函数调用(从0255次)来控制嵌入函数扩展的发生次数,这个编译指示控制用inline__inline标记的或在/Ob2选项下能自动嵌入的嵌入函数。

inline_depth编译指示控制能够被扩展的一系列函数调用。例如,如果嵌入深度是4,并且如果A调用B然后调用C,所有的3次调用都将做嵌入扩展。然而,如果设置的最近一次嵌入深度是2,则只有AB被扩展,而C仍然作为函数调用。

为了使用这个编译指示,你必须设置编译程序选项/Ob1或者2。用这个编译指示指定的深度设定在该指示后面的第一个函数开始生效。如果你在括号内不指定一个值,inline_depth设置嵌入深度到默认值8

在扩展时,嵌入深度可以被减少而不能被增加。如果嵌入深度是6,同时在扩展过程中预处理程序遇到一个inline_depth编译指示设置为8,则深度保持为6

嵌入深度0将拒绝嵌入扩展,深度255将设置在嵌入扩展时没有限制。如果用一个没有指定值的编译指示,则使用为默认值。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值