• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>

            兔子的技術博客

            兔子

               :: 首頁 :: 聯系 :: 聚合  :: 管理
              202 Posts :: 0 Stories :: 43 Comments :: 0 Trackbacks

            留言簿(10)

            最新評論

            閱讀排行榜

            評論排行榜

            文件的尾部或者出現對同一個內含函數指定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將設置在嵌入擴展時沒有限制。如果用一個沒有指定值的編譯指示,則使用為默認值。

            15  inline_recursion

            #pragma inline_recursion( [{on | off}] )

            控制直接或者相互間的遞歸函數調用式的嵌入擴展。用這個編譯指示控制用inline__inline標記的或在/Ob2選項下能自動嵌入的嵌入函數。使用這個編譯指示需要設置編譯程序選項/Ob1或者2。默認的inline_recursion狀態是off。這個編譯指示在出現該編譯指示之后第一個函數調用起作用,并不影響函數的定義。

            inline_recursion編譯指示控制如何擴展遞歸函數。如果inline_recursionoff,并且如果一個嵌入函數調用了它自己(直接的或者間接的),函數將僅僅擴展一次。如果inline_recursionon,函數將擴展多次直到達到inline_depth的值或者容量限制。

            16  intrinsic

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

            指定對在編譯指示參數表中函數調用是內含的。編譯程序像嵌入代碼一樣生成內含函數,而不是函數調用。下面列出了具有內含形式的庫函數。一旦遇到intrinsic編譯指示,它從第一個包含指定內含函數的函數定義開始起作用。作用持續到源文件尾部或者出現包含相同內含函數的function編譯指示。intrinsic編譯指示只能用在函數定義外——在全局層次。

            下列函數具有內含形式:

            _disable

            _enable

            _inp

            _inpw

            _lrotl

            _lrotr

            _outp

            _outpw

            _rotl

            _rotr

            _strset

            abs

            fabs

            labs

            memcmp

            memcpy

            memset

            strcat

            strcmp

            strcpy

            strlen

             

             

             

            使用內含函數的程序更快,因為它們沒有函數調用的額外代價,然而因為有附加的代碼生成,可能比較大。

            注意,_allocasetjmp函數總是內含的,這個行為不受intrinsic編譯指示影響。

            下列浮點函數沒有內含形式。然而它們具有直接將參數通過浮點芯片傳送而不是推入程序堆棧的版本。

            acos

            asin

            cosh

            fmod

            pow

            sinh

            tanh

             

             

             

             

             

            當你同時指定/Oi/Og編譯程序選項(或者任何包含/Og/Ox/O1/O2的選項)時下列浮點函數具有真正的內含形式。

            atan

            exp

            log10

            sqrt

            atan2

            log

            sin

            tan

            cos      

             

             

             

            你可以用編譯程序選項/Op/Za來覆蓋真內含浮點選項的生成。在這種情況下,函數會像一般庫函數一樣被生成,同時直接將參數通過浮點芯片傳送而不是推入程序堆棧。

            17  message

            #pragma message( messagestring )

            不中斷編譯,發送一個字符串文字量到標準輸出。message編譯指示的典型運用是在編譯時顯示信息。

            下面的代碼段用message編譯指示在編譯過程中顯示一條信息:

            #if _M_IX86 == 500

            #pragma message( "Pentium processor build" )

            #endif

            messagestring參數可以是一個能夠擴展成字符串文字量的宏,并且你能夠用字符串文字量和宏的任何組合來構造。例如,下面的語句顯示被編譯文件的文件名和文件最后一次修改的日期和時間。

            #pragma message( "Compiling " __FILE__ )

            #pragma message( "Last modified on " __TIMESTAMP__ )

            18  once

            #pragma once

            指定在創建過程中該編譯指示所在的文件僅僅被編譯程序包含(打開)一次。該編譯指示的一種常見用法如下:

            //header.h

            #pragma once

            // Your C or C++ code would follow:

            19  optimize

            僅在專業版和企業版中存在

            #pragma optimize( "[optimization-list]", {on | off} )

            代碼優化僅有Visual C++專業版和企業版支持。詳見Visual C++ Edition

            指定在函數層次執行的優化。optimize編譯選項必須在函數外出現,并且在該編譯指示出現以后的第一個函數定義開始起作用。onoff參數打開或關閉在optimization-list指定的選項。

            optimization-list能夠是0或更多個在表2.2中給出的參數:

             2.2   optimize編譯指示的參數

            參數

            優化類型

            a

            假定沒有別名。

            g

            允許全局優化。

            p

            增強浮點一致性。

             t

            指定更短或者更快的機器代碼序列。

            w

            假定在函數調用中沒有別名。

            y

            在程序堆棧中生成框架指針。

            這些和在/O編譯程序選項中使用的是相同的字母。例如:

            #pragma optimize( "atp", on )

            用空字符串("")的optimize編譯指示是一種特別形式。它要么關閉所有的優化選項,要么恢復它們到原始(或默認)的設定。

            #pragma optimize( "", off )

            .

            .

            .

            #pragma optimize( "", on )

            20  pack

            #pragma pack( [ n] )

            指定結構和聯合成員的緊縮對齊。盡管用/Zp選項設定整個翻譯單元的結構和聯合成員的緊縮對齊,可以用pack編譯指示在數據說明層次設定緊縮對齊。從出現該編譯指示后的第一個結構或者聯合說明開始生效。這個編譯指示不影響定義。

            當你使用#pragma pack(n),其中n1248或者16,第一個以后的每個結構成員保存在較小的成員類型或者n字節邊界上。如果你使用沒有參數的#pragma pack,結構成員將被緊縮到由/Zp指定的值。默認的/Zp緊縮的大小是/Zp8

            編譯程序還支持下面的增強語法:

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

            該語法允許你將使用不同緊縮編譯指示的組件合并到同一個翻譯單元內。

            每次出現有push參數的pack編譯指示將保存當前的緊縮對齊值到一個內部的編譯程序堆棧。編譯指示的參數列表從左向右讀取。如果你使用了push,當前緊縮值被保存。如果你提供了一個n值,這個值將成為新的緊縮值。如果你指定了一個你選定的標示符,這個標示符將和新的緊縮值關聯。

            每次出現有pop參數的pack編譯指示從內部編譯程序堆棧頂部取出一個值并將那個值作為新的緊縮對齊。如果你用了pop,而內部編譯程序堆棧是空的,對齊值將從命令行得到,同時給出一個警告。如果你用了pop并指定了n的值,那個值將成為新的緊縮值。如果你用了pop并指定了一個標示符,將移去所有保存在堆棧中的的值直到匹配的找到匹配的標示符,和該標示符關聯的緊縮值也被從堆棧中移出來成為新的緊縮值。如果沒有找到匹配的標示符,將從命令行獲取緊縮值并產生一個1級警告。默認的緊縮對齊是8

            pack編譯指示的新的增強功能允許你編寫頭文件保證在使用頭文件之前和其后的緊縮值是一樣的:

            /* File name: include1.h

            */

            #pragma pack( push, enter_include1 )

            /* Your include-file code ... */

            #pragma pack( pop, enter_include1 )

            /* End of include1.h */

            在前面的例子中,進入頭文件時將當前緊縮值和標示符enter_include1關聯并推入,被記住。在頭文件尾部的pack編譯選項移去所有在頭文件中可能遇到的緊縮值并移去和enter_include1關聯的緊縮值。這樣頭文件保證了在使用頭文件之前和其后的緊縮值是一樣的。

            新功能也允許你在你的代碼內用pack編譯指示為不同的代碼,例如頭文件設定不同的緊縮對齊。

            #pragma pack( push, before_include1 )

            #include "include1.h"

            #pragma pack( pop, before_include1 )

            在上一個例子中,你的代碼受到保護,防止了在include.h中的任何緊縮值的改變。

            21  pointers_to_members

            C++特有

            #pragma pointers_to_members(pointer-declaration, [most-general-representation] )

            指定是否能夠在相關類定義之前說明一個指向類成員的指針,并且用于控制指針的大小和解釋指針的代碼。你能夠在你的源代碼中使用pointers_to_members編譯知識來代替/vmx編譯程序選項。

            pointer-declaration參數指出是否在相關函數定義之前或其后你已經說明了一個指向成員的指針。pointer-declaration參數是下面兩個符號之一:

            參數

            說明

            full_generality

            生成安全的,但是有時不能優化的代碼。如果有一些指向成員的指針在相關類定義之前說明,你要用full_generality。這個參數總是使用由most-general-representation指定的指針表示方式。

            best_case

            對于所有指向成員的指針用最佳的表示方式生成安全的,優化的代碼。需要在說明一個指向類成員指針之前定義類。默認是best_case

            most-general-representaion參數指出在一個翻譯單元中編譯程序能夠安全引用任何指向類成員指針的最小指針表示方式。這個參數可以是下列之一:

            參數

            說明

            single_inheritance

            最普通的表示方式是單繼承,指向成員函數。如果用于指向具有多重或者虛擬繼承方式類成員的指針,將產生一個錯誤。

            multi_inheritance

            最普通的表示方式是多重繼承,指向成員函數。如果用于指向具有虛擬繼承方式類成員的指針,將產生一個錯誤。

            virtual_inheritance

            最普通的表示方式是虛擬繼承,指向成員函數。不會產生錯誤。當使用#pragma pointers_to_members (full_generality)時這是默認的參數。

            22  setlocale

            #pragma setlocale( "locale-string" )

            定義用于翻譯寬字符常數和字符串文字量時用的地區(國家和語言)。由于用于從多字節字符轉換到寬字符的算法根據地區或者由于在運行可執行程序不同的地方進行編譯而不同,這個編譯指示提供一種在編譯時指定目標地區的方式。這保證寬字符字符串將以正確的格式保存。默認的locale-string“C”“C”地區將字符串中的每個字符作為wchar_t(即unsigned int)映射其值。

            23  vtordisp

            C++特有

            #pragma vtordisp({on | off} )

            允許隱藏的附加vtordisp構造函數/析構函數替換成員。vtordisp編譯指示僅能夠用于具有虛擬基類的代碼。如果派生類從一個虛擬基類重載了一個虛擬函數,并且如果派生類的構造函數或析構函數用指向虛擬基類的指針調用了這個函數,編譯程序將根據虛擬基類在類中引入一個附加的隱藏“vtordisp”域。

            vtodisp編譯選項影響它后面的類布局。/vd0/vd1選項為整個模塊指定了相同的行為。指定off將禁止隱藏的vtordisp成員,指定on(默認)將在它們需要的時候允許vtordisp。僅在不可能出現類的構造函數和析構函數通過this指針調用其指向對象中的虛擬函數時才關閉vtordisp

            #pragma vtordisp( off )

            class GetReal : virtual public { ... };

            #pragma vtordisp( on )

            24  warning

            #pragma warning( warning-specifier : warning-number-list [,warning-specifier : warning-number-list...] )

            #pragma warning( push[ , n ] )

            #pragma warning( pop )

            允許有選擇地修改編譯程序警告信息的行為。

            warning-specifier能夠是下列值之一:

            warning-specifier

            含義

            once

            只顯示指定信息一次。

            default

            對指定信息應用默認的編譯程序選項。

            1,2,3,4

            對指定信息引用給定的警告等級。

            disable

            不顯示指定信息。

            error

            對指定信息作為錯誤顯示。

            warning-number_list能夠包含任何警告編號。如下,在一個編譯指示中可以指定多個選項:

            #pragma warning( disable : 4507 34; once : 4385; error : 164 )

            這等價于:

            #pragma warning( disable : 4507 34 )  // Disable warning messages

                                                        //  4507 and 34.

            #pragma warning( once : 4385 )         // Issue warning 4385

                                                        //  only once.

            #pragma warning( error : 164 )         // Report warning 164

                                                        //  as an error.

            對于那些關于代碼生成的,大于4699的警告標號,warning編譯指示僅在函數定義外時有效。如果指定的警告編號大于4699并且用于函數內時被忽略。下面例子說明了用warning編譯指示禁止、然后恢復有關代碼生成警告信息的正確位置:

            int a;

            #pragma warning( disable : 4705 )

            void func()

            {

                a;

            }

            #pragma warning( default : 4705 )

            warning編譯指示也支持下面語法:

            #pragma warning( push [ ,n ] )

            #pragma warning( pop )

            這里n表示警告等級(14)。

            warning(push)編譯指示保存所有警告的當前警告狀態。warning(push,n)保存所有警告的當前狀態并將全局警告等級設置為n

            warning(pop)彈出最后一次推入堆棧中的警告狀態。任何在pushpop之間改變的警告狀態將被取消。考慮下面的例子:

            #pragma warning( push )

            #pragma warning( disable : 4705 )

            #pragma warning( disable : 4706 )

            #pragma warning( disable : 4707 )

            // Some code

            #pragma warning( pop )

            在這些代碼的結束,pop恢復了所有警告的狀態(包括470547064707)到代碼開始時候的樣子。

            當你編寫頭文件時,你能用pushpop來保證任何用戶修改的警告狀態不會影響正常編譯你的頭文件。在頭文件開始的地方使用push,在結束地方使用pop。例如,假定你有一個不能順利在4級警告下編譯的頭文件,下面的代碼改變警告等級到3,然后在頭文件的結束時恢復到原來的警告等級。

            #pragma warning( push, 3 )

            // Declarations/ definitions

            #pragma warning( pop )

             

            原文地址 http://tb.blog.csdn.net/TrackBack.aspx?PostId=1621227

             

            posted on 2012-02-10 12:35 會飛的兔子 閱讀(1638) 評論(0)  編輯 收藏 引用 所屬分類: C++及開發環境
            精品久久久中文字幕人妻| 午夜福利91久久福利| 无码人妻少妇久久中文字幕蜜桃 | 久久av高潮av无码av喷吹| 国产精品免费福利久久| 久久国产精品免费一区| 一本色道久久综合亚洲精品| 久久精品人人做人人妻人人玩| 精品免费久久久久国产一区 | 亚洲午夜久久久| 中文字幕乱码人妻无码久久| 久久91亚洲人成电影网站| 少妇熟女久久综合网色欲| 久久青青草原精品影院| 久久人做人爽一区二区三区| 91久久精品无码一区二区毛片| 五月丁香综合激情六月久久| 热久久国产欧美一区二区精品 | 亚洲国产精品成人久久蜜臀 | 久久综合亚洲色HEZYO社区| 91久久精品电影| 精品久久久久久无码专区| 久久夜色精品国产亚洲| 精品无码久久久久久国产| 色综合久久中文综合网| 久久久久久久亚洲Av无码| 久久久久亚洲AV无码专区首JN| 久久天天躁狠狠躁夜夜av浪潮| 亚洲天堂久久精品| 精品久久久久久| 久久久久四虎国产精品| 国产∨亚洲V天堂无码久久久| 亚洲av日韩精品久久久久久a| 亚洲欧洲中文日韩久久AV乱码| 久久精品二区| 日本亚洲色大成网站WWW久久 | 成人a毛片久久免费播放| 国产∨亚洲V天堂无码久久久| 国产V亚洲V天堂无码久久久 | 波多野结衣久久精品| 亚洲色大成网站www久久九|