天天看點

BCB6中的#Pragma說明

1.#pragma alignment

       alignment pragma用于顯示一條目前記憶體對齊(alignment)和枚舉(enum)位元組大小的消息。例如: 

W8035: The alignment is 8 bytes, the enum size is 4 bytes

該消息必須在打開編譯器選項“show general messages”或編譯器開關“-wmsg”後才能顯示。

2.#pragma anon_struct

       #pragma anon_struct on        允許編譯類中内嵌的匿名結構

#pragma anon_struct off              禁止編譯類中内嵌的匿名結構

例如:

#pragma anon_struct on

struct S

{

    int i; 

    struct                          // Embedded anonymous struct

{                        

           int  j ;

          float x ;

    };

S() { i = 1; }

};

#pragma anon_struct off

3.#pragma argsused

       argsused pragma通常在定義一個函數前使用,用于屏蔽函數參數未使用的警告。例如:

#pragma   argsused

       int func(int a,int b)

       ++b;

       return b;

}

如果不使用該pragma,編譯器就會報類似“函數參數沒有用到”的警告消息。

4.#pragma checkoption optionstring

       checkoption pragma檢查optionstring中包含的選項是否已設定。例如:

#pragma checkoption -a4 –b

如果沒有設定,顯示一個錯誤:E2471: pragma checkoption failed: options are not as expected。

5.#pragma codeseg

#pragma codeseg <seg_name> <"seg_class"> <group>

codeseg pragma用于重命名函數代碼所在的段(segment)、類(class)、組(group)。如果codeseg後沒有任何選項,表示使用預設代碼段。

6.#pragma comment

#pragma comment (comment type, "string")

comment pragma用于将一個comment記錄寫入到輸出檔案。Comment類型可以下列值之一:

exestr      編譯器将string寫入到一個.obj檔案中,最終放置到可執行檔案中。使用檔案搜尋工具可以從可執行檔案中找到該string。

lib           連接配接器将一個string中指定的.lib檔案寫入到一個.obj檔案中。

user        編譯器将string寫入到一個.obj檔案中,但連接配接器忽略,就是說最終string不放置到可執行檔案中。

7.#pragma defineonoption and #pragma undefineonoption

       #pragma defineonoption name switch(es)

#pragma undefineonoption name switch(es)

這兩個pragma用于為若幹個指令行開關建立一個别名(name)。除了部分負責輸入的指令行開關(如-I、-L)外,大部分指令開關都可以在這兩個訓示符中使用。

#pragma defineonoption在别名中所有指定開關都已打開的情況下定義name。 

#pragma undefineonoption在别名中所有指定開關都已打開的情況下不定義name。

例如,myfile.c檔案包含下列代碼:

#pragma defineonoption OPTIMIZING -O2

#ifdef    OPTIMIZING

#pragma message We are optimizing with -O2

#else

#pragma message There are no optimizations turned on

#endif

bcc32 -c myfile.c,輸出是There are no optimizations turned on

bcc32 -c -O2 myfile.c,輸出是We are optimizing with -O2

下面是一個同時使用多個指令行開關的執行個體:

#define SWITCHES_ARE_OFF

#pragma undefineonoption SWITCHES_ARE_OFF -O2 -c -P -C

#ifdef    SWITCHES_ARE_OFF

#pragma message At least one of the switches is not turned on

#pragma message All switches are turned on

bcc32 -c myfile.c,輸出是At least one of the switches is not turned on

bcc32 -c -P -O2 -C,輸出是All switches are turned on

8.  #pragma exit and #pragma startup

       #pragma startup function-name <priority>

#pragma exit function-name <priority>

這兩個pragma分别用于指定在main函數調用前調用和在_exit函數調用前調用的函數。函數定義格式如下:

void func(void);

priority參數數值範圍為64-255,0值級别最高。級别越高,在main函數調用前越早調用,在-exit函數調用前越晚調用。預設級别為100。0-63級别C庫保留使用。

9.#pragma hdrfile

       #pragma hdrfile "filename.CSM"

       hdrfile pragma用于指定預編譯頭檔案的名稱。前提是必須已啟用預編譯頭檔案功能。

10.#pragma hdrstop

#pragma hdrstop

hdrstop pragma用于終止若幹個頭檔案的預編譯,可有效減少預編譯頭檔案占用的磁盤空間。

凡在源檔案中#pragma hdrstop指令之前被引用的頭檔案都将被預編譯成預編譯頭檔案。假如一個頭檔案同時被多個源檔案引用,那麼生成的預編譯頭檔案同樣可被多個源檔案共享。是以,在工程中#pragma hdrstop指令之前包含通用頭檔案可獲得更好的編譯性能。

例如,一個新應用程式建立後,源檔案“Unit1.cpp”都會包含類似内容:

#include <vcl.h>       // common header file

#pragma hdrstop       // terminate list here

#include "Unit1.h"       // specific header file

#pragma hdrstop指令隻能在源檔案中使用,頭檔案中使用沒有任何效果。

11.#pragma inline

#pragma inline

該指令等同于“-B”指令行選項。.

#pragma inline指令最好放在源檔案的頂部,因為編譯器每次遇到#pragma inline指令都會加上“-B”指令行選項重新編譯該檔案。

12.#pragma intrinsic

#pragma intrinsic [-]function-name

#pragma intrinsic用于重寫控制函數内聯的指令行開關或IDE選項。

内聯一個指定的函數前必須包含該函數的原型。

#pragma intrinsic strcpy

編譯器将在調用strcpy函數的函數内産生strcpy函數實作代碼。

#pragma intrinsic –strcpy

阻止編譯器對strcpy内聯。

13.#pragma link

#pragma link “[path]modulename[.ext]”

該指令指令連接配接器将一個檔案連接配接到可執行檔案中。預設情況下,連接配接器預設在本地路徑下查找modulename檔案,modulename檔案字尾為“.obj”。使用指令行選項“-L”或者path參數指定任意路徑。

14.#pragma message

#pragma message ("text" ["text"["text" ...]])

#pragma message text

#pragma message (text)

使用這三個指令用于在程式代碼中顯示自定義的消息。

第一個指令用于輸出一個消息,其中的宏不被展開。

第二個指令用于輸出一個包含宏的消息,其中的宏将被展開。

第三個指令用于展開并輸出一個已定義的宏。如果宏未被定義,将輸出一個該指令無效的消息。

#ifdef __BORLANDC__

#pragma message you are compiling using version __BORLANDC__ of C++Builder.

#pragma message “sorry,you are not using C++Builder compiler.”

14.#pragma obsolete

#pragma obsolete identifier

凡是在程式代碼中該指令後遇到identifier辨別符,預編譯器将第一時間給出一個警告資訊。警告顯示該辨別符已廢棄。

15.#pragma option

       #pragma option options

#pragma option push options

#pragma option pop

#pragma nopushoptwarn

使用#pragma option指令用于在程式代碼中包含指令行選項。#pragma option指令也可以附加push 和 pop參數後使用。

大部分指令行選項都可以作為options參數使用。options參數允許同時包含多個指令行選項。例如:

#pragma option -C

#pragma option -C –A

使用#pragma option push指令可以儲存目前所有的指令行選項。#pragma option pop指令和#pragma option push指令配對使用,用于恢複以前儲存的指令行選項。例如:

#pragma option push

#include <theworld.h>

#include “ystuff.h”

下面的執行個體因push和pop指令未配對使用,将會産生一個空棧警告。

#pragma option pop      /* Warning */

通過#pragma warn –nop指令可以關閉這個警告。

有一點必須特别注意,必須保證每個檔案中的#pragma option push和#pragma option pop指令配對使用。如果在檔案結尾和檔案開始時的指令行選項堆棧内容不一緻,将會顯示一個警告:“以前的選項和警告沒有恢複?”。

通過#pragma nopushoptwarn.指令關閉這個警告。

16.#pragma pack

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

#pragma pack(n)指令和#pragma option –an指令的作用是一樣的。n表示編譯器在記憶體中排列資料的位元組對齊方式。

#pragma pack()表示選擇編譯器預設的位元組對齊方式,預設為8位元組。

#pragma pack(n)表示選擇n值作為位元組對齊方式。n可以為1,2,4,8和16。

#pragma pack(push) 表示壓入目前位元組對齊方式。

#pragma pack(push, ident) 表示關聯辨別符ident後壓入目前位元組對齊方式。

#pragma pack(push, n) 表示壓入目前位元組對齊方式,選擇n值作為位元組對齊方式。

#pragma pack(push, ident, n) 表示關聯辨別符ident後壓入目前位元組對齊方式,選擇n值作為位元組對齊方式。

#pragma pack(pop) 表示彈出最後壓入的位元組對齊方式。

#pragma pack(pop, ident) 表示彈出關聯辨別符ident的位元組對齊方式。如果沒有找到該辨別符,選擇預設位元組對齊方式。

#pragma pack(pop,n) 表示彈出n值大小的位元組對齊方式。如果沒有找到比對的内容,選擇預設位元組對齊方式。

#pragma pack(pop, ident,n) 表示彈出關聯辨別符ident的n值大小的位元組對齊方式。如果沒有找到比對的内容,選擇預設位元組對齊方式。

#pragma pop指令必須和#pragma push指令配對使用。