青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

pragma comment的使用(轉)

#pragma 的使用

盡管 C 和 C++ 都已經有標準,但是幾乎每個編譯器 (廣義,包含連接器等) 擴展一些 C/C++ 關鍵字。

合理地應用這些關鍵字,有時候能使我們的工作非常方便。下面隨便說說 Visual C++ 中 #pragma

指示符的使用。

一、用#pragma導出DLL函數

    傳統的到出 DLL 函數的方法是使用模塊定義文件 (.def),Visual C++ 提供了更簡潔方便的方法,

那就是“__declspec()”關鍵字后面跟“dllexport”,告訴連接去要導出這個函數,例如:


__declspec(dllexport) int __stdcall MyExportFunction(int iTest);

    把“__declspec(dllexport)”放在函數聲明的最前面,連接生成的 DLL 就會導出函數

“_MyExportFunction@4”。

    上面的導出函數的名稱也許不是我的希望的,我們希望導出的是原版的“MyExportFunction”。

還好,VC 提供了一個預處理指示符“#pragma”來指定連接選項 (不僅僅是這一個功能,還有很多指示功能) ,

如下:


#pragma comment(linker,"/EXPORT:MyExportFunction=_MyExportFunction@4")

    這下就天如人愿了:)。如果你想指定導出的順序,或者只將函數導出為序號,沒有 Entryname,

這個預處理指示符 (確切地說是連接器) 都能夠實現,看看 MSDN 的語法說明:


/EXPORT:entryname[,@ordinal[,NONAME]][,DATA]

   @ordinal 指定順序;NONAME 指定只將函數導出為序號;DATA 關鍵字指定導出項為數據項。

二、指示文件只包含一次

    在頭文件中,一般在整個工程中我們只要包含一次就夠了,但是如果我在多個 .c/.cpp 文件中都要包

含著個頭文件,比如 Windows.h,那很多聲明等等豈不是有兩次了?解決這個問題的傳統的方法是在頭文件

開始出用

#define 定義一個宏,比如 Windows.h 中:


    
      #ifndef _WINDOWS_#define _WINDOWS_
    
    
    P>    然后在文件結為加上 #endif,這樣就可以避免被包含多次。但是這樣的后果是代碼的可讀性較差

(個人觀點),VC 給我們提供了另外一個途徑,那就是在文件的前面加上:#pragma once    是不是很方便?

三、使警告無效    有時候我們不得不對變量進行強制轉換,由此引來編譯器的一番警告,特別是 C++ 中

,類型檢查相對于 C 更為嚴格。這雖然不影響什么,但是看起來多不爽——我是故意要這樣的,

你警告什么!:)這時候你看到警告類型,

比如“warning C4311: “類型轉換” : 從“HHOOK”到“BOOL”的指針截斷”,在前面加上:

#pragma warning(disable: 4311)    編譯器就沒話說了:)。

四、指定連接要使用的庫    比如我們連接的時候用到了 WSock32.lib,你當然可以

不辭辛苦地把它加入到你的工程中。但是我覺得更方便的方法是使用 #pragma 指示符,指定要連接的庫:

#pragma comment(lib, "WSock32.lib")五、顯示編譯消息    沒多少用處,舉個例子吧:

#ifdef _DEBUG#pragma message

("編譯連接為調試模式...")#endif // _DEBUG

 

 

在所有的預處理指令中,#Pragma 指令可能是最復雜的了,它的作用是設定編譯器的狀態或者是指示

編譯器完成一些特定的動作。#pragma
指令對每個編譯器給出了一個方法,在保持與C和C++語言完全兼容的情況下,給出主機或操作系統專有

的特征。依據定義,編譯指示是機器或操作系統專有的,且對于每個編譯器都是不同的。
其格式一般為: #Pragma Para
其中Para 為參數,下面來看一些常用的參數。

(1)message 參數。 Message 參數是我最喜歡的一個參數,它能夠在編譯信息輸出窗
口中輸出相應的信息,這對于源代碼信息的控制是非常重要的。其使用方法為:
#Pragma message(“消息文本”)
當編譯器遇到這條指令時就在編譯輸出窗口中將消息文本打印出來。
當我們在程序中定義了許多宏來控制源代碼版本的時候,我們自己有可能都會忘記有沒有正確的設

置這些宏,此時我們可以用這條指令在編譯的時候就進行檢查。假設我們希望判斷自己有沒有在源

代碼的什么地方定義了

_X86這個宏可以用下面的方法
#ifdef _X86
#Pragma message(“_X86 macro activated!”)
#endif
當我們定義了_X86這個宏以后,應用程序在編譯時就會在編譯輸出窗口里顯示“_
X86 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(smart_init) ,BCB就會根據優先級的

大小先后編譯。

(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 )保存所有警告信息的現有的警告狀態。
#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和4707)。
(7)pragma comment(...)
該指令將一個注釋記錄放入一個對象文件或可執行文件中。
常用的lib關鍵字,可以幫我們連入一個庫文件。



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

comment-type是一個預定義的標識符,指定注釋的類型,應該是compiler,exestr,lib,linker之一。
commentstring是一個提供為comment-type提供附加信息的字符串,
Remarks:
1、compiler:放置編譯器的版本或者名字到一個對象文件,該選項是被linker忽略的。
2、exestr:在以后的版本將被取消。
3、lib:放置一個庫搜索記錄到對象文件中,這個類型應該是和
commentstring(指定你要Liner搜索的lib的名稱和路徑)
這個庫的名字放在Object文件的默認庫搜索記錄的后面,linker搜索這個這個庫就像你在命令行輸入這個命令一樣。你可以
在一個源文件中設置多個庫記錄,它們在object文件中的順序和在源文件中的順序一樣。如果默認庫和附加庫的次序是需要
區別的,使用Z編譯開關是防止默認庫放到object模塊。
4、linker:指定一個連接選項,這樣就不用在命令行輸入或者在開發環境中設置了。
只有下面的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]

使用該選項,可以從程序導出函數,以便其他程序可以調用該函數。也可以導出數據。通常在 DLL 中定義導出。entryname 是調用程序要使用的函數或數據項的名稱。ordinal 在導出表中指定范圍在 1 至 65,535 的索引;如果沒有指定 ordinal,則 LINK 將分配一個。NONAME 關鍵字只將函數導出為序號,沒有 entryname

DATA 關鍵字指定導出項為數據項。客戶程序中的數據項必須用 extern __declspec(dllimport) 來聲明。
有三種導出定義的方法,按照建議的使用順序依次為:

  1. 源代碼中的 __declspec(dllexport)

  2. .def 文件中的 EXPORTS 語句

  3. LINK 命令中的 /EXPORT 規范

所有這三種方法可以用在同一個程序中。LINK 在生成包含導出的程序時還創建導入庫,除非生成中使用了 .exp 文件。
LINK 使用標識符的修飾形式。編譯器在創建 .obj 文件時修飾標識符。如果 entryname 以其未修飾的形式指定給鏈接器(與其在源代碼中一樣),則 LINK 將試圖匹配該名稱。如果無法找到唯一的匹配名稱,則 LINK 發出錯誤信息。當需要將標識符指定給鏈接器時,請使用 Dumpbin 工具獲取該標識符的修飾名形式。

(3)/INCLUDE:symbol

/INCLUDE 選項通知鏈接器將指定的符號添加到符號表。

若要指定多個符號,請在符號名稱之間鍵入逗號 (,)、分號 (;) 或空格。在命令行上,對每個符號指定一次 /INCLUDE:symbol
鏈接器通過將包含符號定義的對象添加到程序來解析 symbol。該功能對于添包含不會鏈接到程序的庫對象非常有用。用該選項指定符號將通過 /OPT:REF 重寫該符號的移除。



我們經常用到的是#pragma   comment(lib,"*.lib")這類的。
#pragma   comment(lib,"Ws2_32.lib")表示鏈接Ws2_32.lib這個庫。   
和在工程設置里寫上鏈入Ws2_32.lib的效果一樣,不過這種方法寫的   
程序別人在使用你的代碼的時候就不用再設置工程settings了

posted on 2010-08-07 22:21 蝸牛也Coding 閱讀(17319) 評論(1)  編輯 收藏 引用

評論

# re: pragma comment的使用(轉) 2011-09-02 18:32 chanel watches

I really like:
-Malleus Maleficarium, as a good history book and very eye opening as well  回復  更多評論   


只有注冊用戶登錄后才能發表評論。
網站導航: 博客園   IT新聞   BlogJava   博問   Chat2DB   管理


<2010年8月>
25262728293031
1234567
891011121314
15161718192021
22232425262728
2930311234

導航

統計

常用鏈接

留言簿(8)

隨筆檔案(78)

搜索

積分與排名

最新評論

閱讀排行榜

評論排行榜

青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <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>
            欧美一区二区视频观看视频| 久久精品一区二区三区不卡| 亚洲欧美一区二区三区极速播放| 亚洲精品网站在线播放gif| 国内一区二区在线视频观看 | 欧美高清影院| 亚洲国产美国国产综合一区二区| 欧美福利视频一区| 亚洲国产欧美一区| 一区二区三区国产在线| 亚洲欧美美女| 免费日韩av片| 欧美特黄一级| 狠狠色综合日日| 亚洲日本中文字幕| 香蕉av777xxx色综合一区| 久久午夜精品一区二区| 亚洲国产视频直播| 亚洲欧美视频在线观看视频| 91久久夜色精品国产九色| 欧美激情视频给我| 国产精品自拍一区| 91久久久在线| 欧美一级免费视频| 亚洲国产精品久久精品怡红院| 亚洲精品极品| 欧美综合二区| 国产精品国码视频| 亚洲欧洲综合另类| 久久久国产一区二区| 日韩特黄影片| 久久久久久久波多野高潮日日| 欧美日韩一区在线视频| 亚洲第一久久影院| 欧美在线精品免播放器视频| 亚洲国产精品综合| 久久久www成人免费无遮挡大片| 欧美日韩精品高清| 亚洲国产欧美一区二区三区同亚洲| 亚洲免费视频在线观看| 亚洲激情精品| 免费久久99精品国产| 国产婷婷色一区二区三区| 一区二区三区**美女毛片| 欧美a级在线| 欧美在线播放| 国产亚洲欧洲| 欧美在线播放一区二区| 中文日韩在线视频| 欧美久久综合| av成人福利| 亚洲日本中文| 欧美极品影院| 夜夜嗨av一区二区三区中文字幕| 欧美成人一区二区三区片免费| 亚洲综合色噜噜狠狠| 国产精品少妇自拍| 欧美在线|欧美| 欧美亚洲网站| 激情另类综合| 女主播福利一区| 久久婷婷麻豆| 亚洲激情国产| 亚洲精品在线免费| 国产精品国产三级欧美二区 | 久久综合国产精品| 影音先锋日韩精品| 欧美成人激情在线| 欧美成人在线免费视频| 亚洲另类自拍| 一二三四社区欧美黄| 国产精品女人久久久久久| 欧美一二三区在线观看| 性做久久久久久久久| 国产专区精品视频| 欧美激情一区二区| 亚洲福利电影| 日韩视频在线免费| 国产精品久久久久久妇女6080| 亚洲自拍偷拍麻豆| 午夜精品久久久久久久蜜桃app| 国产日韩一区二区三区在线播放| 久久久亚洲一区| 麻豆成人综合网| 亚洲一级二级在线| 久久久久久久精| 99精品免费| 小黄鸭精品密入口导航| 亚洲国产免费| 亚洲桃色在线一区| 在线精品亚洲| 一本久久青青| 精品1区2区3区4区| 99www免费人成精品| 国产午夜精品全部视频在线播放| 欧美粗暴jizz性欧美20| 欧美午夜视频网站| 美女福利精品视频| 国产精品久久一卡二卡| 欧美国产精品久久| 国产噜噜噜噜噜久久久久久久久| 欧美国产日韩亚洲一区| 国产精品欧美久久| 欧美大片在线看| 国产欧美日韩精品专区| 91久久久久久国产精品| 国产一区亚洲| 亚洲一区在线看| 日韩亚洲欧美在线观看| 久久国产精品一区二区| 亚洲主播在线播放| 女生裸体视频一区二区三区| 欧美诱惑福利视频| 国产精品国产三级国产专区53 | 久久久综合精品| 欧美日韩美女| 亚洲经典在线| 亚洲人成久久| 久久午夜精品| 久久久久久穴| 国产日韩欧美二区| 亚洲婷婷综合久久一本伊一区| 亚洲免费福利视频| 麻豆精品精华液| 老司机午夜精品| 国产欧美精品xxxx另类| 亚洲一级影院| 亚洲男同1069视频| 欧美色播在线播放| 亚洲精品中文字幕女同| 亚洲精品自在在线观看| 久久综合给合| 欧美阿v一级看视频| 国内精品国产成人| 久久国产一区二区三区| 久久久一本精品99久久精品66| 国产啪精品视频| 欧美一区二区三区电影在线观看| 亚洲欧美国产高清| 亚洲精品乱码久久久久久黑人 | 美女精品国产| 伊大人香蕉综合8在线视| 久久精品欧美日韩| 另类春色校园亚洲| 亚洲第一区色| 欧美精品www在线观看| 亚洲精品一区二区在线| 亚洲视频碰碰| 国产精品有限公司| 欧美中文字幕在线观看| 欧美va天堂| 99国产精品视频免费观看一公开| 欧美激情免费观看| 在线视频欧美一区| 久久精品国产77777蜜臀| 伊人成人在线| 欧美久久一区| 亚洲男人第一av网站| 久久综合网络一区二区| 亚洲精品影视在线观看| 欧美午夜激情小视频| 欧美一级片久久久久久久 | 香蕉成人啪国产精品视频综合网| 久久精品国亚洲| 日韩视频―中文字幕| 国产精品国产亚洲精品看不卡15| 欧美一区二区免费观在线| 欧美国产日韩精品免费观看| 亚洲系列中文字幕| 国产综合18久久久久久| 欧美精品一线| 欧美在线日韩| 亚洲人成人77777线观看| 欧美制服丝袜| 亚洲狼人精品一区二区三区| 国产精品一区二区在线| 麻豆乱码国产一区二区三区| 亚洲美女视频在线观看| 久久久精品国产免大香伊| 亚洲美女尤物影院| 国内精品久久久久久久影视蜜臀| 欧美精品入口| 久热精品在线| 午夜精品久久| 亚洲理论在线观看| 免费观看在线综合| 欧美亚洲视频一区二区| 亚洲国产日韩欧美在线99| 国产伦精品一区二区三区照片91 | 亚洲国产清纯| 国产午夜精品全部视频在线播放 | 一区二区视频免费完整版观看| 欧美日韩亚洲三区| 欧美成人a∨高清免费观看| 性久久久久久久久久久久| 99亚洲一区二区| 亚洲激情av在线| 国产精品国产三级国产aⅴ无密码 国产精品国产三级国产aⅴ入口 | 亚洲人成绝费网站色www| 蜜桃精品久久久久久久免费影院|