#pragma 详解
#pragma
求助編輯
pragma?-?必應(yīng)詞典 - 美[p'r?ɡm(xù)?]英[p'r?ɡm(xù)?]
- n.〔計〕雜注
- 網(wǎng)絡(luò)編譯指示;顯示編譯指示;特殊指令
百科名片 在所有的預(yù)處理指令中,#Pragma 指令可能是最復(fù)雜的了,它的作用是設(shè)定編譯器的狀態(tài)或者是指示編譯器完成一些特定的動作。#pragma指令對每個編譯器給出了一個方法,在保持與C和C++語言完全兼容的情況下,給出主機或操作系統(tǒng)專有的特征。依據(jù)定義,編譯指示是機器或操作系統(tǒng)專有的,且對于每個編譯器都是不同的。
目錄
編輯本段一般格式
其格式一般為: #pragma Para。其中Para 為參數(shù),下面來看一些常用的參數(shù)編輯本段常用參數(shù)
#pragma
message 參數(shù)
Message 參數(shù)能夠在編譯信息輸出窗口中輸出相應(yīng)的信息,這對于源代碼信息的控制是非常重要的。其使用方法為: #pragma message(“消息文本”) 當編譯器遇到這條指令時就在編譯輸出窗口中將消息文本打印出來。 當我們在程序中定義了許多宏來控制源代碼版本的時候,我們自己有可能都會忘記有沒有正確的設(shè)置這些宏,此時我們可以用這條指令在編譯的時候就進行檢查。假設(shè)我們希望判斷自己有沒有在源代碼的什么地方定義了_X86這個宏可以用下面的方法 #ifdef _X86 #pragma message(“_X86 macro activated!”) #endif 當我們定義了_X86這個宏以后,應(yīng)用程序在編譯時就會在編譯輸出窗口里顯示“_X86 macro activated!”。我們就不會因為不記得自己定義的一些特定的宏而抓耳撓腮了。code_seg
另一個使用得比較多的pragma參數(shù)是code_seg。格式如: #pragma code_seg( ["section-name"[,"section-class"] ] ) 它能夠設(shè)置程序中函數(shù)代碼存放的代碼段,當我們開發(fā)驅(qū)動程序的時候就會使用到它。#pragma once
(比較常用) 只要在頭文件的最開始加入這條指令就能夠保證頭文件被編譯一次,這條指令實際上在VC6中就已經(jīng)有了,但是考慮到兼容性并沒有太多的使用它。 #pragma once是編譯相關(guān),就是說這個編譯系統(tǒng)上能用,但在其他編譯系統(tǒng)不一定可以,也就是說移植性差,不過現(xiàn)在基本上已經(jīng)是每個編譯器都有這個定義了。 #ifndef,#define,#endif這個是C++語言相關(guān),這是C++語言中的宏定義,通過宏定義避免文件多次編譯。所以在所有支持C++語言的編譯器上都是有效的,如果寫的程序要跨平臺,最好使用這種方式#pragma hdrstop
#pragma hdrstop表示預(yù)編譯頭文件到此為止,后面的頭文件不進行預(yù)編譯。BCB可以預(yù)編譯頭文件以加快鏈接的速度,但如果所有頭文件都進行預(yù)編譯又可能占太多磁盤空間,所以使用這個選項排除一些頭文件。 有時單元之間有依賴關(guān)系,比如單元A依賴單元B,所以單元B要先于單元A編譯。你可以用#pragma startup指定編譯優(yōu)先級,如果使用了#pragma package(smart_init) ,BCB就會根據(jù)優(yōu)先級的大小先后編譯。#pragma resource
#pragma resource "*.dfm"表示把*.dfm文件中的資源加入工程。*.dfm中包括窗體外觀的定義。#pragma warning
#pragma warning( disable : 4507 34; once : 4385; error : 164 ) 等價于: #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 )保存所有警告信息的現(xiàn)有的警告狀態(tài)。 #pragma warning( push, n)保存所有警告信息的現(xiàn)有的警告狀態(tài),并且把全局警告等級設(shè)定為n。 #pragma warning( pop )向棧中彈出最后一個警告信息, 在入棧和出棧之間所作的一切改動取消。例如: #pragma warning( push ) #pragma warning( disable : 4705 ) #pragma warning( disable : 4706 ) #pragma warning( disable : 4707 ) //....... #pragma warning( pop ) 在這段代碼的最后,重新保存所有的警告信息(包括4705,4706和4707)。pragma comment
pragma comment(...) 該指令將一個注釋記錄放入一個對象文件或可執(zhí)行文件中。 常用的lib關(guān)鍵字,可以幫我們連入一個庫文件。 每個編譯程序可以用#pragma指令激活或終止該編譯程序支持的一些編譯功能。例如,對循環(huán)優(yōu)化功能: #pragma loop_opt(on) // 激活 #pragma loop_opt(off) // 終止 有時,程序中會有些函數(shù)會使編譯器發(fā)出你熟知而想忽略的警告,如“Parameter xxx is never used in function xxx”,可以這樣: #pragma warn —100 // Turn off the warning message for warning #100 int insert_record(REC *r) { /* function body */ } #pragma warn +100 // Turn the warning message for warning #100 back on 函數(shù)會產(chǎn)生一條有唯一特征碼100的警告信息,如此可暫時終止該警告。 每個編譯器對#pragma的實現(xiàn)不同,在一個編譯器中有效在別的編譯器中幾乎無效。可從編譯器的文檔中查看。 #pragma pack(n)和#pragma pop() struct sample { char a; double b; }; 當sample結(jié)構(gòu)沒有加#pragma pack(n)的時候,sample按最大的成員那個對齊; (所謂的對齊是指對齊數(shù)為n時,對每個成員進行對齊,既如果成員a的大小小于n則將a擴大到n個大小; 如果a的大小大于n則使用a的大小;)所以上面那個結(jié)構(gòu)的大小為16字節(jié). 當sample結(jié)構(gòu)加#pragma pack(1)的時候,sizeof(sample)=9字節(jié);無空字節(jié)。 (另注:當n大于sample結(jié)構(gòu)的最大成員的大小時,n取最大成員的大小。 所以當n越大時,結(jié)構(gòu)的速度越快,大小越大;反之則) #pragma pop()就是取消#pragma pack(n)的意思了,也就是說接下來的結(jié)構(gòu)不用#pragma pack(n) #pragma comment( comment-type ,["commentstring"] ) comment-type是一個預(yù)定義的標識符,指定注釋的類型,應(yīng)該是compiler,exestr,lib,linker之一。 commentstring是一個提供為comment-type提供附加信息的字符串。 注釋類型: 1、compiler: 放置編譯器的版本或者名字到一個對象文件,該選項是被linker忽略的。 2、exestr: 在以后的版本將被取消。 3、lib: 放置一個庫搜索記錄到對象文件中,這個類型應(yīng)該是和commentstring(指定你要Linker搜索的lib的名稱和路徑)這個庫的名字放在Object文件的默認庫搜索記錄的后面,linker搜索這個這個庫就像你在命令行輸入這個命令一樣。你可以在一個源文件中設(shè)置多個庫記錄,它們在object文件中的順序和在源文件中的順序一樣。如果默認庫和附加庫的次序是需要區(qū)別的,使用Z編譯開關(guān)是防止默認庫放到object模塊。 4、linker: 指定一個連接選項,這樣就不用在命令行輸入或者在開發(fā)環(huán)境中設(shè)置了。 只有下面的linker選項能被傳給Linker. /DEFAULTLIB ,/EXPORT,/INCLUDE,/MANIFESTDEPENDENCY, /MERGE,/SECTION (1) /DEFAULTLIB:library /DEFAULTLIB 選項將一個 library 添加到 LINK 在解析引用時搜索的庫列表。用 /DEFAULTLIB指定的庫在命令行上指定的庫之后和 .obj 文件中指定的默認庫之前被搜索。忽略所有默認庫 (/NODEFAULTLIB) 選項重寫 /DEFAULTLIB:library。如果在兩者中指定了相同的 library 名稱,忽略庫 (/NODEFAULTLIB:library) 選項將重寫 /DEFAULTLIB:library。 (2)/EXPORT:entryname[,@ordinal[,NONAME]][,DATA] 使用該選項,可以從程序?qū)С龊瘮?shù),以便其他程序可以調(diào)用該函數(shù)。也可以導出數(shù)據(jù)。通常在 DLL 中定義導出。entryname是調(diào)用程序要使用的函數(shù)或數(shù)據(jù)項的名稱。ordinal 在導出表中指定范圍在 1 至 65,535 的索引;如果沒有指定 ordinal,則 LINK 將分配一個。NONAME關(guān)鍵字只將函數(shù)導出為序號,沒有?entryname。 DATA?關(guān)鍵字指定導出項為數(shù)據(jù)項。客戶程序中的數(shù)據(jù)項必須用?extern __declspec(dllimport)來聲明。 有三種導出定義的方法,按照建議的使用順序依次為: 源代碼中的 __declspec(dllexport).def 文件中的 EXPORTS 語句LINK 命令中的 /EXPORT 規(guī)范所有這三種方法可以用在同一個程序中。LINK 在生成包含導出的程序時還創(chuàng)建導入庫,除非生成中使用了 .exp 文件。 LINK 使用標識符的修飾形式。編譯器在創(chuàng)建 .obj 文件時修飾標識符。如果?entryname以其未修飾的形式指定給鏈接器(與其在源代碼中一樣),則 LINK 將試圖匹配該名稱。如果無法找到唯一的匹配名稱,則 LINK 發(fā)出錯誤信息。當需要將標識符指定給鏈接器時,請使用 Dumpbin 工具獲取該標識符的修飾名形式。 (3)/INCLUDE:symbol /INCLUDE 選項通知鏈接器將指定的符號添加到符號表。 若要指定多個符號,請在符號名稱之間鍵入逗號 (,)、分號 (;) 或空格。在命令行上,對每個符號指定一次 /INCLUDE:symbol。 鏈接器通過將包含符號定義的對象添加到程序來解析 symbol。該功能對于添包含不會鏈接到程序的庫對象非常有用。用該選項指定符號將通過 /OPT:REF 重寫該符號的移除。 我們經(jīng)常用到的是#pragma comment(lib,"*.lib")這類的。#pragma comment(lib,"Ws2_32.lib")表示鏈接Ws2_32.lib這個庫。 和在工程設(shè)置里寫上鏈入Ws2_32.lib的效果一樣,不過這種方法寫的 程序別人在使用你的代碼的時候就不用再設(shè)置工程settings了編輯本段應(yīng)用實例
在網(wǎng)絡(luò)協(xié)議編程中,經(jīng)常會處理不同協(xié)議的數(shù)據(jù)報文。一種方法是通過指針偏移的 方法來得到各種信息,但這樣做不僅編程復(fù)雜,而且一旦協(xié)議有變化,程序修改起來 也比較麻煩。在了解了編譯器對結(jié)構(gòu)空間的分配原則之后,我們完全可以利用這 一特性定義自己的協(xié)議結(jié)構(gòu),通過訪問結(jié)構(gòu)的成員來獲取各種信息。這樣做, 不僅簡化了編程,而且即使協(xié)議發(fā)生變化,我們也只需修改協(xié)議結(jié)構(gòu)的定義即可, 其它程序無需修改,省時省力。下面以TCP協(xié)議首部為例,說明如何定義協(xié)議結(jié)構(gòu)。 其協(xié)議結(jié)構(gòu)定義如下: #pragma pack(1) // 按照1字節(jié)方式進行對齊 struct TCPHEADER { short SrcPort; // 16位源端口號 short DstPort; // 16位目的端口號 int SerialNo; // 32位序列號 int AckNo; // 32位確認號 unsigned char HaderLen : 4; // 4位首部長度 unsigned char Reserved1 : 4; // 保留6位中的4位 unsigned char Reserved2 : 2; // 保留6位中的2位 unsigned char URG : 1; unsigned char ACK : 1; unsigned char PSH : 1; unsigned char RST : 1; unsigned char SYN : 1; unsigned char FIN : 1; short WindowSize; // 16位窗口大小 short TcpChkSum; // 16位TCP檢驗和 short UrgentPointer; // 16位緊急指針 }; #pragma pop() // 取消1字節(jié)對齊方式 #pragma pack規(guī)定的對齊長度,實際使用的規(guī)則是: 結(jié)構(gòu),聯(lián)合,或者類的數(shù)據(jù)成員,第一個放在偏移為0的地方,以后每個數(shù)據(jù)成員的對齊,按照#pragma pack指定的數(shù)值和這個數(shù)據(jù)成員自身長度中,比較大的那個進行。 但是,當#pragma pack的值等于或超過最長數(shù)據(jù)成員的長度的時候,這個值的大小將不產(chǎn)生任何效果。 而結(jié)構(gòu)整體的對齊,則按照結(jié)構(gòu)體中最大的數(shù)據(jù)成員 和 #pragma pack指定值 之間,較小的那個進行。 指定連接要使用的庫比如我們連接的時候用到了 WSock32.lib,你當然可以不辭辛苦地把它加入到你的工程中。但是我覺得更方便的方法是使用 #pragma 指示符,指定要連接的庫:#pragma comment(lib, "WSock32.lib")#pragma 預(yù)處理指令詳解
?(2006-12-5?15:33) 在所有的預(yù)處理指令中,#pragma 指令可能是最復(fù)雜的了,它的作用是設(shè)定編譯器的狀態(tài)或者是指示編譯器完成一些特定的動作。#pragma指令對每個編譯器給出了一個方法,在保持與C和C++語言完全兼容的情況下,給出主機或操作系統(tǒng)專有的特征。
依據(jù)定義,編譯指示是機器或操作系統(tǒng)專有的,且對于每個編譯器都是不同的。??
??? 其格式一般為: #pragma? para??
??? 其中para為參數(shù),下面來看一些常用的參數(shù)。??
?
(1)message 參數(shù)
??? message參數(shù)是我最喜歡的一個參數(shù),它能夠在編譯信息輸出窗口中輸出相應(yīng)的信息,
這對于源代碼信息的控制是非常重要的。其使用方法為:??
??? #pragma? message("消息文本")??
??? 當編譯器遇到這條指令時就在編譯輸出窗口中將消息文本打印出來。??
??? 當我們在程序中定義了許多宏來控制源代碼版本的時候,我們自己有可能都會忘記有沒有正確的設(shè)置這些宏,
此時我們可以用這條指令在編譯的時候就進行檢查。假設(shè)我們希望判斷自己有沒有在源代碼的什么地方定義了_X86這個宏,
可以用下面的方法:
??? #ifdef? _X86??
??? #pragma? message("_X86? macro? activated!")??
??? #endif??
??? 我們定義了_X86這個宏以后,應(yīng)用程序在編譯時就會在編譯輸出窗口里顯示"_86? macro? activated!"。
我們就不會因為不記得自己定義的一些特定的宏而抓耳撓腮了。??
??????
(2)另一個使用得比較多的pragma參數(shù)是code_seg
??? 格式如:??
??? #pragma? code_seg( ["section-name" [, "section-class"] ] )??
??? 它能夠設(shè)置程序中函數(shù)代碼存放的代碼段,當我們開發(fā)驅(qū)動程序的時候就會使用到它。??
?
(3)#pragma once? (比較常用)?
??? 只要在頭文件的最開始加入這條指令就能夠保證頭文件被編譯一次,這條指令實際上在VC6中就已經(jīng)有了,
但是考慮到兼容性并沒有太多的使用它。?
???????
(4)#pragma? hdrstop
??? 表示預(yù)編譯頭文件到此為止,后面的頭文件不進行預(yù)編譯。BCB可以預(yù)編譯頭文件以加快鏈接的速度,
但如果所有頭文件都進行預(yù)編譯又可能占太多磁盤空間,所以使用這個選項排除一些頭文件。????
??? 有時單元之間有依賴關(guān)系,比如單元A依賴單元B,所以單元B要先于單元A編譯。
你可以用#pragma? startup指定編譯優(yōu)先級,如果使用了#pragma? package(smart_init),
BCB就會根據(jù)優(yōu)先級的大小先后編譯。???
???????
(5)#pragma? resource? "*.dfm"
??? 表示把*.dfm文件中的資源加入工程。*.dfm中包括窗體??
外觀的定義。???
?????????
(6)#pragma? warning( disable: 4507 34; once: 4385; error: 164 )
??
??? 等價于:??
??? #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 )保存所有警告信息的現(xiàn)有的警告狀態(tài)。??
??? #pragma? warning( push, n )保存所有警告信息的現(xiàn)有的警告狀態(tài),并且把全局警告等級設(shè)定為n。????
??? #pragma? warning( pop )向棧中彈出最后一個警告信息,在入棧和出棧之間所作的一切改動取消。例如:??
??? #pragma? warning( push )??
??? #pragma? warning( disable: 4705 )??
??? #pragma? warning( disable: 4706 )??
??? #pragma? warning( disable: 4707 )??
??? //.......??
??? #pragma? warning(? pop? )????
??? 在這段代碼的最后,重新保存所有的警告信息(包括4705,4706和4707)。?
(7)#pragma? comment(...)?
??? 該指令將一個注釋記錄放入一個對象文件或可執(zhí)行文件中。??
常用的lib關(guān)鍵字,可以幫我們連入一個庫文件。如:
??? #pragma? comment(lib, "comctl32.lib")
??? #pragma? comment(lib, "vfw32.lib")
??? #pragma? comment(lib, "wsock32.lib")
?
???
???
每個編譯程序可以用#pragma指令激活或終止該編譯程序支持的一些編譯功能。
例如,對循環(huán)優(yōu)化功能:??
#pragma? loop_opt(on)???? //? 激活??
#pragma? loop_opt(off)??? //? 終止?
有時,程序中會有些函數(shù)會使編譯器發(fā)出你熟知而想忽略的警告,
如“Parameter? xxx? is? never? used? in? function? xxx”,可以這樣:??
#pragma? warn? —100???????? //? Turn? off? the? warning? message? for? warning? #100??
int? insert_record(REC? *r)??
{? /*? function? body? */? }??
#pragma? warn? +100????????? //? Turn? the? warning? message? for? warning? #100? back? on??
函數(shù)會產(chǎn)生一條有唯一特征碼100的警告信息,如此可暫時終止該警告。?
每個編譯器對#pragma的實現(xiàn)不同,在一個編譯器中有效在別的編譯器中幾乎無效。可從編譯器的文檔中查看。
補充 —— #pragma pack 與 內(nèi)存對齊問題
??? 許多實際的計算機系統(tǒng)對基本類型數(shù)據(jù)在內(nèi)存中存放的位置有限制,它們會要求這些數(shù)據(jù)的首地址的值是某個數(shù)k
(通常它為4或8)的倍數(shù),這就是所謂的內(nèi)存對齊,而這個k則被稱為該數(shù)據(jù)類型的對齊模數(shù)(alignment modulus)。
??? Win32平臺下的微軟C編譯器(cl.exe for 80x86)在默認情況下采用如下的對齊規(guī)則:?
??? 任何基本數(shù)據(jù)類型T的對齊模數(shù)就是T的大小,即sizeof(T)。比如對于double類型(8字節(jié)),
就要求該類型數(shù)據(jù)的地址總是8的倍數(shù),而char類型數(shù)據(jù)(1字節(jié))則可以從任何一個地址開始。
??? Linux下的GCC奉行的是另外一套規(guī)則(在資料中查得,并未驗證,如錯誤請指正):
??? 任何2字節(jié)大小(包括單字節(jié)嗎?)的數(shù)據(jù)類型(比如short)的對齊模數(shù)是2,而其它所有超過2字節(jié)的數(shù)據(jù)類型
(比如long,double)都以4為對齊模數(shù)。
??? ANSI C規(guī)定一種結(jié)構(gòu)類型的大小是它所有字段的大小以及字段之間或字段尾部的填充區(qū)大小之和。
填充區(qū)就是為了使結(jié)構(gòu)體字段滿足內(nèi)存對齊要求而額外分配給結(jié)構(gòu)體的空間。那么結(jié)構(gòu)體本身有什么對齊要求嗎?
有的,ANSI C標準規(guī)定結(jié)構(gòu)體類型的對齊要求不能比它所有字段中要求最嚴格的那個寬松,可以更嚴格。
如何使用c/c++中的對齊選項
??? vc6中的編譯選項有 /Zp[1|2|4|8|16] ,/Zp1表示以1字節(jié)邊界對齊,相應(yīng)的,/Zpn表示以n字節(jié)邊界對齊。
n字節(jié)邊界對齊的意思是說,一個成員的地址必須安排在成員的尺寸的整數(shù)倍地址上或者是n的整數(shù)倍地址上,取它們中的最小值。
也就是:
??? min ( sizeof ( member ),? n)
??? 實際上,1字節(jié)邊界對齊也就表示了結(jié)構(gòu)成員之間沒有空洞。
??? /Zpn選項是應(yīng)用于整個工程的,影響所有的參與編譯的結(jié)構(gòu)。
??? 要使用這個選項,可以在vc6中打開工程屬性頁,c/c++頁,選擇Code Generation分類,在Struct member alignment可以選擇。
??? 要專門針對某些結(jié)構(gòu)定義使用對齊選項,可以使用#pragma pack編譯指令:
(1) #pragma? pack( [ n ] )
??? 該指令指定結(jié)構(gòu)和聯(lián)合成員的緊湊對齊。而一個完整的轉(zhuǎn)換單元的結(jié)構(gòu)和聯(lián)合的緊湊對齊由/Zp 選項設(shè)置。
緊湊對齊用pack編譯指示在數(shù)據(jù)說明層設(shè)置。該編譯指示在其出現(xiàn)后的第一個結(jié)構(gòu)或聯(lián)合說明處生效。
該編譯指示對定義無效。
??? 當你使用#pragma? pack ( n ) 時, 這里n 為1、2、4、8 或16。
??? 第一個結(jié)構(gòu)成員之后的每個結(jié)構(gòu)成員都被存儲在更小的成員類型或n 字節(jié)界限內(nèi)。
如果你使用無參量的#pragma? pack, 結(jié)構(gòu)成員被緊湊為以/Zp 指定的值。該缺省/Zp 緊湊值為/Zp8 。
(2) 編譯器也支持以下增強型語法:
??? #pragma? pack( [ [ { push | pop } , ] [ identifier, ] ] [ n] )
??? 若不同的組件使用pack編譯指示指定不同的緊湊對齊, 這個語法允許你把程序組件組合為一個單獨的轉(zhuǎn)換單元。
帶push參量的pack編譯指示的每次出現(xiàn)將當前的緊湊對齊存儲到一個內(nèi)部編譯器堆棧中。
??? 編譯指示的參量表從左到右讀取。如果你使用push, 則當前緊湊值被存儲起來;?
如果你給出一個n 的值, 該值將成為新的緊湊值。若你指定一個標識符, 即你選定一個名稱,?
則該標識符將和這個新的的緊湊值聯(lián)系起來。
??? 帶一個pop參量的pack編譯指示的每次出現(xiàn)都會檢索內(nèi)部編譯器堆棧頂?shù)闹?并且使該值為新的緊湊對齊值。
如果你使用pop參量且內(nèi)部編譯器堆棧是空的,則緊湊值為命令行給定的值, 并且將產(chǎn)生一個警告信息。
若你使用pop且指定一個n的值, 該值將成為新的緊湊值。若你使用p o p 且指定一個標識符,?
所有存儲在堆棧中的值將從棧中刪除, 直到找到一個匹配的標識符, 這個與標識符相關(guān)的緊湊值也從棧中移出,?
并且這個僅在標識符入棧之前存在的緊湊值成為新的緊湊值。如果未找到匹配的標識符,?
將使用命令行設(shè)置的緊湊值, 并且將產(chǎn)生一個一級警告。缺省緊湊對齊為8 。
?? pack編譯指示的新的增強功能讓你編寫頭文件, 確保在遇到該頭文件的前后的
緊湊值是一樣的。
(3) 棧內(nèi)存對齊
??? 在vc6中棧的對齊方式不受結(jié)構(gòu)成員對齊選項的影響。它總是保持對齊,而且對齊在4字節(jié)邊界上。
總結(jié)
以上是生活随笔為你收集整理的#pragma 详解的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: oracle停止trace日志,关闭OR
- 下一篇: 用友通ERP客户端报无法登陆错