• <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>

            colorful

            zc qq:1337220912

             

            同步/異步與阻塞/非阻塞的區別消息

            http://vrlinux.com/wenzhangjingxuan/20100908/75026.html

            我喜歡用自己的語言通過聯系現實生活中的一些現象解釋一些概念,當我能做到這一點時,說明我已經理解了這個概念.今天要解釋的概念是:同步/異步與阻塞/非阻塞的區別.

            這兩組概念常常讓人迷惑,因為它們都是涉及到IO處理,同時又有著一些相類似的地方.

            首先來解釋同步和異步的概念,這兩個概念與消息的通知機制有關.

            舉個例子,比如我去銀行辦理業務,可能選擇排隊等候,也可能取一個小紙條上面有我的號碼,等到排到我這一號時由柜臺的人通知我輪到我去辦理業務了.
            前 者(排隊等候)就是同步等待消息,而后者(等待別人通知)就是異步等待消息.在異步消息處理中,等待消息者(在這個例子中就是等待辦理業務的人)往往注冊 一個回調機制,在所等待的事件被觸發時由觸發機制(在這里是柜臺的人)通過某種機制(在這里是寫在小紙條上的號碼)找到等待該事件的人.
            而在實際的程序中,同步消息處理就好比簡單的read/write操作,它們需要等待這兩個操作成功才能返回;而異步處理機制就是類似于select/poll之類的多路復用IO操作,當所關注的消息被觸發時,由消息觸發機制通知觸發對消息的處理.

            其次再來解釋一下阻塞和非阻塞,這兩個概念與程序等待消息(無所謂同步或者異步)時的狀態有關.
            繼 續上面的那個例子,不論是排隊還是使用號碼等待通知,如果在這個等待的過程中,等待者除了等待消息之外不能做其它的事情,那么該機制就是阻塞的,表現在程 序中,也就是該程序一直阻塞在該函數調用處不能繼續往下執行.相反,有的人喜歡在銀行辦理這些業務的時候一邊打打電話發發短信一邊等待,這樣的狀態就是非 阻塞的,因為他(等待者)沒有阻塞在這個消息通知上,而是一邊做自己的事情一邊等待.但是需要注意了,第一種同步非阻塞形式實際上是效率低下的,想象一下 你一邊打著電話一邊還需要抬頭看到底隊伍排到你了沒有,如果把打電話和觀察排隊的位置看成是程序的兩個操作的話,這個程序需要在這兩種不同的行為之間來回 的切換,效率可想而知是低下的;而后者,異步非阻塞形式卻沒有這樣的問題,因為打電話是你(等待者)的事情,而通知你則是柜臺(消息觸發機制)的事情,程 序沒有在兩種不同的操作中來回切換.

            很多人會把同步和阻塞混淆,我想是因為很多時候同步操作會以阻塞的形式表現出來,比如很多人會寫阻塞 的read/write操作,但是別忘了可以對fd設置O_NONBLOCK標志位,這樣就可以將同步操作變成非阻塞的了;同樣的,很多人也會把異步和非 阻塞混淆,因為異步操作一般都不會在真正的IO操作處被阻塞,比如如果用select函數,當select返回可讀時再去read一般都不會被阻塞,就好 比當你的號碼排到時一般都是在你之前已經沒有人了,所以你再去柜臺辦理業務就不會被阻塞.

            可見,同步/異步與阻塞/非阻塞是兩組不同的概念,它們可以共存組合,也可以參見這里:
            http://www.ibm.com/developerworks/cn/linux/l-async/

            ----------------------------------------- 分割線 ------------------------------------------------------
            昨晚寫完這篇文章之后,今早來看了看反饋,同時再自己閱讀了幾遍,發現還是有一些地方解釋的不夠清楚,在這里繼續補充完善一下我的說法,但愿沒有越說越糊涂.

            同步和異步:上面提到過,同步和異步僅僅是關于所關注的消息如何通知的機制,而不是處理消息的機制.也就是說,同步的情況下,是由處理消息者自己去等待消息是否被觸發,而異步的情況下是由觸發機制來通知處理消息者,所以在異步機制中,處理消息者和觸發機制之間就需要一個連接的橋梁,在我們舉的例子中這個橋梁就是小紙條上面的號碼,而在select/poll等IO多路復用機制中就是fd,當消息被觸發時,觸發機制通過fd找到處理該fd的處理函數.

            請注意理解消息通知和處理消息這 兩個概念,這是理解這個問題的關鍵所在.還是回到上面的例子,輪到你辦理業務這個就是你關注的消息,而去辦理業務就是對這個消息的處理,兩者是有區別的. 而在真實的IO操作時,所關注的消息就是該fd是否可讀寫,而對消息的處理就是對這個fd進行讀寫.同步/異步僅僅關注的是如何通知消息,它們對如何處理 消息并不關心,好比說,銀行的人僅僅通知你輪到你辦理業務了,而如何辦理業務他們是不知道的.

            而很多人之所以把同步和阻塞混淆,我想也是 因為沒有區分這兩個概念,比如阻塞的read/write操作中,其實是把消息通知和處理消息結合在了一起,在這里所關注的消息就是fd是否可讀/寫,而 處理消息則是對fd讀/寫.當我們將這個fd設置為非阻塞的時候,read/write操作就不會在等待消息通知這里阻塞,如果fd不可讀/寫則操作立即 返回.

            很多人又會問了,異步操作不會是阻塞的吧?已經通知了有消息可以處理了就一定不是阻塞的了吧?
            其實異步操作是可以被阻塞住的,只不過通常不是在處理消息時阻塞,而是在等待消息被觸發時被阻塞. 比如select函數,假如傳入的最后一個timeout參數為NULL,那么如果所關注的事件沒有一個被觸發,程序就會一直阻塞在這個select調用 處.而如果使用異步非阻塞的情況,比如aio_*組的操作,當我發起一個aio_read操作時,函數會馬上返回不會被阻塞,當所關注的事件被觸發時會調 用之前注冊的回調函數進行處理,具體可以參見我上面的連接給出的那篇文章.回到上面的例子中,如果在銀行等待辦理業務的人采用的是異步的方式去等待消息被 觸發,也就是領了一張小紙條,假如在這段時間里他不能離開銀行做其它的事情,那么很顯然,這個人被阻塞在了這個等待的操作上面;但是呢,這個人突然發覺自 己煙癮犯了,需要出去抽根煙,于是他告訴大堂經理說,排到我這個號碼的時候麻煩到外面通知我一下(注冊一個回調函數),那么他就沒有被阻塞在這個等待的操 作上面,自然這個就是異步+非阻塞的方式了.

             

            posted @ 2012-03-29 11:53 多彩人生 閱讀(368) | 評論 (0)編輯 收藏

            Qt安裝—搭建VS2008+QT開發環境

            http://blog.csdn.net/mac_cm/article/details/6591168

            Qt安裝—搭建VS2008+QT開發環境

              (一)工欲善其事,必先利其器,廢話不多講。

                  總結起來網上流行的VS2008+QT安裝說明有以下幾個問題需要解釋清楚:
                 1,首先明確需要下載什么版本的QT。網上流行的安裝說明只是針對過去舊版本的QT,還有要求下載VS2008 SP1補丁的等等。很亂,對于剛接觸Qt開發者會造成不必要的困擾,安裝個開發環境真的需要那么繁瑣和勞神嗎
                 2,對于環境變量的配置,諸如path,QTDIR 和WindowsSdkDir等等。實際上都是舊版本的Qt,新版本的Qt已經不需要設置了。
                 3,真的必須要configure 和nmake QT嗎?對于漫長的編譯過程和七七八八的編譯錯誤?我們完全沒有不必要折騰了,這里我們下載已經編譯好的QT版本就夠了,估計QT版本4.6以下需要這樣做。     

            (二)對于以上的問題,我是按照網上說法大費周折無果,實際新版本的Qt安裝起來非常簡單。

                  第一步:安裝VS2008,我這里安裝的是中文版的VS2008并且也沒有安裝VS2008 SP1,對于VS2008的安裝過程這里省略了。

                  第二步:安裝Qt,訪問Qt官方網站http://qt.nokia.com/downloads-cn下載2個軟件:

                  1,下載VS2008編譯好的QT4.7版本:http://get.qt.nokia.com/qt/source/qt-win-opensource-4.7.0-vs2008.exe
                  提示:minGW版本不用下,他是minGW工具編譯下的QT庫。QTSDK-qt-sdk-win-opensource-2010.05.exe 也不用下載,它是用QT獨立進行開發下的完整軟件安裝包,安裝過程與一般軟件相同,點擊下一步就行了。

                  2,下載VS2008的Qt插件:http://get.qt.nokia.com/vsaddin/qt-vs-addin-1.1.7.exe
                  提示:這是個針對VS(VS2005、VS2008、VS2010)各個版本都適用的QT插件,插件安裝過程也是一樣,點擊下一步就行了。

                  3,對于VS和QT的安裝順序,沒有嚴格的要求,并沒有誰先誰后,這里我是之前已經安裝好了VS2008中文版的。

                 (三)安裝好VS2008和QT相關軟件之后,測試安裝是否成功?

                  第一步:啟動VS2008,會發現VS2008的菜單欄出現Qt這個菜單

                 

                  第二步:單擊VS2008的Qt菜單

                 

                  第三步:打開Qt Option可以看到Qt的Version已經被自動識別好(并非像老版本需要手動去設置) 

                 第四步:打開VS2008,新建一個Qt項目

             

            第五步:編譯并運行MyApp項目,這里先不用(Qt的UI設計器,下面章節再進行介紹)設計,默認編譯運行就行

            生成的項目目錄結構圖:

            運行成功截圖如下:

            總結:雖然在軟件開發中,建議老版本的Qt穩定些,還有最好用英文版的VS2008,主要考慮穩定性,不過這里考慮到編譯和設置舊版本的Qt實在繁瑣耗時,并且弄了半天還是編譯不通過,只好用新版本的Qt,這里還算順利,沒有出現什么錯誤,希望給新手一點幫助。

            posted @ 2012-03-28 23:11 多彩人生 閱讀(11804) | 評論 (1)編輯 收藏

            C++中operator的另一種用法

            http://www.joyloft.net/?p=484

            幾乎所有的C++教材上都講了operator在C++中是重載操作符的關鍵字,但是恕我學業不精,昨天研究C++的語法文件時,才發現這個關鍵字還可以用來定義隱式的類型轉換。

            參見如下代碼,類A在需要的時候可以自動的轉換成bool形。

            1. class A
            2. {
            3. ??? public:
            4. ????? operator bool(void)
            5. ????? {
            6. ????????? return b;
            7. ????? }
            8. ??? private:
            9. ????? bool b;
            10. };
            11.  
            12. void main(void)
            13. {
            14. ??? A a;
            15. ??? bool b;
            16. ??? if(a)
            17. ??? {
            18. ??????? b = ! a;
            19. ??? }
            20. }

            Post a comment 我有話說Trackback URI 引用路徑(Trackback URI)

            XML 訂閱本站

            本文 (鏈接) 由 Zenzen發表于 星期三, 八月 1st, 2007 4:09 PM,屬于以下分類 編程開發.

            ?

            Comments (3) left to “C++中operator的另一種用法”

            1. 夜弓 wrote:

              隱式轉換有兩個辦法嘛
              一個就是上面說的operator type_name()
              另外一個是非explict的單參構造函數
              不過依賴隱式轉換很容易出問題,而且很難調試
              恐怕只有自己寫東西玩,和庫作者才會用到

              Posted on 04-Aug-07 at 6:41 pm | Permalink

            2. 夜弓 wrote:

              補充一句
              其實上面這樣定義出來的還是叫做重載操作符
              應該是,類型轉換操作符
              就像C里面常見的(char)iValue一樣。
              不過也可以用來進行隱式轉換。

              Posted on 04-Aug-07 at 10:59 pm | Permalink

            3. 小彬 wrote:

              隱式類型轉換可以使用構造函數以及但參數的構造函數
              class type
              {
              int a;
              public:
              type (int b) {
              a = b;
              }
              };

              main ()
              {
              type c = 123; //在此調用的是type的構造函數,自動轉換類型。不過只有在初始化對象時才可以
              }
              在函數調用中也行

              void fun(type a)
              {

              }

              main ()
              {
              fun (123); //并沒有錯誤,不過一個前提是函數的形參必須是傳值調用而不能引用,并且沒有參數為int類型的重載函數,否則會調用參數為int的函數(涉及到候選函數問題)
              }

              順便說一下,你的主頁很有意思

            posted @ 2012-03-22 20:45 多彩人生 閱讀(578) | 評論 (0)編輯 收藏

            log4cpp

            以下是個人理解,完善中.

            三個組件: appender, layout, category
                 category: 它應該是appender的集合器,就好像插線板,可以接多個電器,并將電流傳給各個電器
                 appender: 指定了個輸出目的地,如FileAppender輸出到文件, OstreamAppender輸出到流。
                                 通過成員函數setLayout指定輸出格式
                 layout: 就是輸出格式

            相關資料:
            http://www.ibm.com/developerworks/cn/linux/l-log4cpp/

            posted @ 2012-03-22 10:52 多彩人生 閱讀(266) | 評論 (0)編輯 收藏

            好的產品源于構建過程嗎

            原文名為:品質在于構建過程嗎, 出自:http://coolshell.cn/articles/5625.html

            一個好的產品源于一個好的想法,把想法轉為現實的過程為構建過程

            構建過程影響的只是“想法到現實”的難易程度,當一個構建過程實現出來的不是你心中的產品,你一定會尋找新的構建過程

            ===============================================

            今天在微博上看到幾位敏捷愛好者探討敏捷測試和質量保證問題,我忍不住也加入了討論:

            Z先生原帖:我剛才看到一個大會演講稿,談到敏捷測試六大指導原則:1.僅靠測試人員不可能獲得高質量的軟件,質量是整個研發團隊的責任;2. 場景是不可窮舉的,測試活動必須是風險驅動的,關注于高風險的場景;3.分層自動化測試是唯一出路;4.在正確的位置進行恰當的測試是自動化的關鍵;【待續】

            S先生回復:品質在于構建過程。檢驗貫穿構建過程,提供及時反饋。

            我回復:什么樣的構建過程才能出Unix這樣的品質呢?迭代?快速反饋?TDD?

            S先生回復:據說stroustrup聽到重構時的反應是,我們從七十年代就這樣做了。推薦《UNIX編程環境》,了解大師的編程方式。

            我回復:您偷換了概念。不能說大師用了重構,C++和UNIX的品質就是靠重構或某種構建過程得來的。廚師做菜用到了勺子,不等于菜好吃是因為勺子。

            S先生回復:我沒有概念。我們看到一個果,就問因是什么。其實是泛因果,無因果,一切是機緣湊巧。

            我回復:“品質在于構建過程”難道不是一個明白的因果描述嗎?

            S先生回復:品質在于構建的人。我說話時沒因果,你看到了因果。

            我回復:歡迎敏捷愛好者圍觀!

            很高興幾個回合討論下來S先生修正了先前“品質在于構建過程”的觀點。什么重構、TDD、迭代、快速反饋等等構建過程都不是Unix品質的核心要素。我不但不認同“品質在于構建過程”、“測試是最好的設計方法”這類機械式的觀點,而且也不滿意把軟件優劣歸結于“人是根本”的簡單回答。我們需要探索一個既非機械式,也非簡單地歸結為某種理念的答案。

            像Unix這樣優秀的軟件,真正的核心要素到底是什么呢?我的答案是:模型,即人心中的軟件。在看得見、摸得著之前,Unix的品質就已經存在于設計者的心中了,他們不會在Unix誕生后驚訝:“哇,Unix的穩定性這么好,7×24小時運行,從來不藍屏”。模型一定是設計者心中最美的東西,為什么我們閱讀操作系統源代碼會像進入迷宮一般理不清頭緒,而作者自己卻覺得頭頭是道呢?因為作者早已“胸有成竹”,我們以為他幾十萬行代碼敲很辛苦,實際上在他自己看來是按部就班一步步向目標靠近。

            模型是軟件的靈魂,存在于設計者的心中,而軟件的構建過程正是心中的世界向現實世界逐漸投影。模型可以是完美的,而現實卻非完美,或許有時候我們很幸運地到達了,或許有時候我們不得不向現實妥協,改變心中的世界。試圖制造燈泡的愛迪生可能會一時找不到熔點極高的發光金屬而止步不前,企圖制造永動機的人則根本無法實現。在不完美的現實中,我們明明想的是a+b,卻敲成了a-b;我們以為某個API可以很快返回,沒想到卻等了5秒鐘,為了不阻塞用戶不得不改成了異步。Review、測試等構建過程在一定程度上彌補了現實的不完美,并對模型給予了反饋,但它卻無法決定軟件的特質。如果設計者心中沒有Unix,即使每個實現環節都層層檢驗,擁有光速般的反饋,他有怎么能構建出Unix呢?Windows NT內核和Windows 3.1內核的品質差別不在于微軟采用了兩種不同的構建過程,而在于它們采用了不同的內核模型。靈魂與軀體的差別就在于此!雖然對于普通的軟件開發通常有不少成熟的模型供選擇,并不需要總是創造自己的模型,但理解模型間的差異,并在設計時選用恰當的模型仍然比采用某種構建過程更加重要。服務器架構采用Nginx似的異步IO模型,還是采用Apache似的每個請求一個線程的模型遠比開發是否采用了TDD更為重要。

            模型的產生是柔性的,主要源于靈感;過程的執行是剛性的,主要源于邏輯。蘋果砸在牛頓的腦袋上能砸出萬有引力模型,砸在我們腦袋上卻只是“哎呦”一聲;但一個蘋果3元錢,兩個蘋果2*3=6元錢卻在牛頓和我們面前是平等的。迷信靈感和迷信邏輯是兩個錯誤的極端,孔子講“天下國家可均也,爵祿可辭也,白刃可蹈也,中庸不可能也”,任何一項技能的高級階段都是關于“度”的藝術。如同光具有波粒二象性,軟件開發也具有藝術創作和工業生產的二象性,它包含了柔性的設計和剛性的過程。越是不成熟的前沿領域越表現出柔性特征;越是成熟的一般領域越表現出工業生產的特征。因此,一個以新產品為主的創業型公司應當更注重設計,更需要畫家、詩人般的創造型人才;而業務成熟產品穩定的大公司應當更注重過程,更需要踏踏實實的生產線工人似的人才。但在當今這個瞬息萬變的信息時代,即使是世界500強的大公司也越來越不穩定,越來越需要創新才能適應,所以即使大公司也不可忽視軟件開發的柔性特征。同時,我們也不能迷信模型,過程同樣可以成為企業的核心競爭力,比如:富士康。虛虛實實,實實虛虛,其妙無窮。老外做Nike品牌(虛),我們做代工生產(實),高額利潤被老外拿走了;我們經營航空公司(虛),老外生產波音飛機(實)高價賣給我們,高額利潤又被老外拿走了。靠虛取勝還是靠實取勝?這是個問題^_^

            或許我對于模型柔性的描述不太讓人滿意,人們多習慣于有章可循的感覺,即便不是死板的知識,起碼要找個“在某某思想的指導下”才覺得心里有著落。或許還有人說,模型的確重要,那么我們能不能有一個過程、模式或套路來推導出模型呢?比如,現在非常流行的從用戶需求出發的分析模式,即“分析需求,抽象出共性,共性是本質的,本質是穩定的”,這類模式的特點符合人們希望找到套路的心理,一看就明白,容易操作,有成就感。我不否認這類模式的確可以得出可用的軟件設計,沿用成熟的模型也未嘗不可。但我們應該明白,心中的世界遠比現實的世界更廣大更美妙。世界是多元的,用戶需求、成熟模型等直接可見的東西只代表了某幾個維度的視圖,設計者心中應當有更多的維度!用戶需要一個文本編輯器,是設計者心中的世界決定了他交出的作品是Vi,還是Emacs,亦或是Notepad。亨利·福特說:“如果你問用戶需要什么,他會告訴你一匹更快的馬”。汽車源于福特心中的世界,這是一個比只有馬的世界更多彩的世界。喬布斯是一個不重視市場調研的人,iPod,iPhone,iPad都不是發個問卷,做個市場調查看看用戶需要什么的結果。Apple是喬布斯心中的世界在現實中的投影!所以,請打破“從用戶需求出發”,“從模式出發”的迷信,釋放你的想象力,讓自己心中的世界去包容現實的世界吧!

            每個人心中都有一個屬于自己的世界,牛頓運動定律是牛頓心中的世界,相對論是愛因斯坦心中的世界。哪一個才是本來的世界呢?有沒有本來的世界呢?本來的世界是什么樣子呢?… 老子給我們啟示“道可道,非常道”,說得清,道得明,想得到的都不是永恒的真理,所以真理不可言說,對真理的探索永遠沒有止境……

            posted @ 2012-03-14 19:47 多彩人生 閱讀(168) | 評論 (0)編輯 收藏

            vs2008 編譯 log4cpp 報錯解決方案

            1. log4cpp1.0僅提供了vc6的工程文件,使用vs2008(VS2005)打開工程并進行轉換

            2. 直接編譯log4cppDLL, 提示Custom Build Step時出現錯誤:

            因為log4cpp在生成NTEventLogAppender.dll時,需要連接NTEventLogCategories.mc文件。 所以,項目設置了自定義的生成步驟去生成NTEventLogAppender.dll。但從vc6的工程文件轉換時,這些步驟卻沒有正確的轉換過來。

            3. 重新填寫Custom Build Step項:(右鍵->工程屬性->選擇自定義生成步驟
            if not exist $(OutDir) md $(OutDir)
            "mc.exe" -h $(OutDir) -r $(OutDir) $(SolutionDir)NTEventLogCategories.mc
            "RC.exe" -r -fo $(OutDir)\$(InputName).res $(ProjectDir)\$(InputName).rc
            "link.exe" /MACHINE:IX86 -dll -noentry -out:$(OutDir)\NTEventLogAppender.dll $(OutDir)\$(InputName).res

            4. 在(右鍵->工程屬性->選擇自定義生成步驟)Outputs填寫:$(OutDir)\NTEventLogAppender.dll

            5. 繼續編譯, 再次報錯, 連接失敗, 找不到符號

            因為工程沒有包含源文件: FactoryParams.cpp & Localtime.cpp

            6. 手動添加上述兩個文件到工程, 重新編譯通過, 并生成log4cpp.dll


            posted @ 2012-03-10 13:16 多彩人生 閱讀(720) | 評論 (0)編輯 收藏

            基于LGPL開源項目 Log4cpp安裝與使用

                 摘要: 【IT168 專稿】Log4cpp是一個開源的C++類庫,它提供了在C++程序中使用日志和跟蹤調試的功能。使用log4cpp,可以很便利地將日志或者跟蹤調試信息寫入字符流、內存字符串隊列、文件、回滾文件、調試器、Windows日志、syslog和遠程syslog服務器中。   1、Log4cpp簡介   Log4cpp是個基于LGPL的開源項目,移植自Java的日志處理跟蹤項目log4j,并保...  閱讀全文

            posted @ 2012-03-10 11:52 多彩人生 閱讀(3067) | 評論 (0)編輯 收藏

            數據庫

            sql, nosql, 內存數據庫


            關系數據庫,是建立在關系模型基礎上的數據庫,借助于集合代數等數學概念和方法來處理數據庫中的數據。現實世界中的各種實體以及實體之間的各種聯系均用關系模型來表示。關系模型是由埃德加·科德于1970年首先提出的,并配合“科德十二定律”。現如今雖然對此模型有一些批評意見,但它還是數據存儲的傳統標準。標準數據查詢語言SQL就是一種基于關系數據庫的語言,這種語言執行對關系數據庫中數據的檢索和操作。 關系模型由關系數據結構、關系操作集合、關系完整性約束三部分組成

            實體關系模型

              實體關系模型(Entity-Relationship Model),簡稱E-R Model是陳品山(Peter P.S Chen)博士于1976年提出的一套數據庫的設計工具,他運用真實世界中事物與關系的觀念,來解釋數據庫中的抽象的數據架構。實體關系模型利用圖形的方式(實體-關系圖(Entity-Relationship Diagram))來表示數據庫的概念設計,有助于設計過程中的構思及溝通討論。
              關系模型就是指二維表格模型,因而一個關系型數據庫就是由二維表及其之間的聯系組成的一個數據組織。當前主流的關系型數據庫有Oracle、DB2、Microsoft SQL Server、Microsoft Access、MySQL等。

            關系操作
              關系模塊中常用的操作包括:
              數據查詢
              選擇 投影 連接 并 交 差 除 數據操作 增加 刪除 修改 更新
            ///////////////////////////////////

            posted @ 2012-03-09 16:58 多彩人生 閱讀(208) | 評論 (0)編輯 收藏

            VS中的路徑宏

            說明

            $(RemoteMachine)

            設置為“調試”屬性頁上“遠程計算機”屬性的值。有關更多信息,請參見更改用于 C/C++ 調試配置的項目設置。

            $(References)

            以分號分隔的引用列表被添加到項目中。

            $(ConfigurationName)

            當前項目配置的名稱(例如“Debug”)。

            $(PlatformName)

            當前項目平臺的名稱(例如“Win32”)。

            $(Inherit)

            指定在由項目生成系統所撰寫的命令行中,繼承的屬性出現的順序。默認情況下,繼承的屬性出現在當前屬性的末尾。

            $(NoInherit)

            使任何將被繼承的屬性不被繼承。若還要避免同級級別的計算,請使用 $(StopEvaluating)。使用 $(NoInherit)會導致對于同一屬性忽略任何出現的 $(Inherit)

            $(StopEvaluating)

            立即停止計算鏈中宏的計算。出現在 $(StopEvaluating) 之后的任何值將不出現在宏的計算值中。如果$(StopEvaluating) 在 $(Inherit) 之前,計算鏈中當前位置的繼承值將不會連接到宏值。$(StopEvaluating)是 $(NoInherit) 的功能超集。

            $(ParentName)

            包含此項目項的項的名稱。該名稱將是父文件夾名稱或項目名稱。

            $(RootNameSpace)

            包含應用程序的命名空間(如果有)。

            $(IntDir)

            為中間文件指定的相對于項目目錄的目錄路徑。它解析為“中間目錄”屬性的值。

            $(OutDir)

            輸出文件目錄的路徑,相對于項目目錄。這解析為“輸出目錄”屬性的值。

            $(DevEnvDir)

            Visual Studio .NET 的安裝目錄(定義形式:驅動器 + 路徑);包括尾部的反斜杠“\”。

            $(InputDir)

            輸入文件的目錄(定義形式:驅動器 + 路徑);包括尾部的反斜杠“\”。如果該項目是輸入,則此宏等效于 $(ProjectDir)。

            $(InputPath)

            輸入文件的絕對路徑名(定義形式:驅動器 + 路徑 + 基本名稱 + 文件擴展名)。如果該項目是輸入,則此宏等效于 $(ProjectPath)。

            $(InputName)

            輸入文件的基本名稱。如果該項目是輸入,則此宏等效于 $(ProjectName)。

            $(InputFileName)

            輸入文件的文件名(定義為基本名稱 + 文件擴展名)。如果該項目是輸入,則此宏等效于 $(ProjectFileName)。

            $(InputExt)

            輸入文件的文件擴展名。它在文件擴展名的前面包括“.”。如果該項目是輸入,則此宏等效于 $(ProjectExt)。

            $(ProjectDir)

            項目的目錄(定義形式:驅動器 + 路徑);包括尾部的反斜杠“\”。

            $(ProjectPath)

            項目的絕對路徑名(定義形式:驅動器 + 路徑 + 基本名稱 + 文件擴展名)。

            $(ProjectName)

            項目的基本名稱。

            $(ProjectFileName)

            項目的文件名(定義為基本名稱 + 文件擴展名)。

            $(ProjectExt)

            項目的文件擴展名。它在文件擴展名的前面包括“.”。

            $(SolutionDir)

            解決方案的目錄(定義形式:驅動器 + 路徑);包括尾部的反斜杠“\”。

            $(SolutionPath)

            解決方案的絕對路徑名(定義形式:驅動器 + 路徑 + 基本名稱 + 文件擴展名)。

            $(SolutionName)

            解決方案的基本名稱。

            $(SolutionFileName)

            解決方案的文件名(定義為基本名稱 + 文件擴展名)。

            $(SolutionExt)

            解決方案的文件擴展名。它在文件擴展名的前面包括“.”。

            $(TargetDir)

            生成的主輸出文件的目錄(定義形式:驅動器 + 路徑);包括尾部的反斜杠“\”。

            $(TargetPath)

            生成的主輸出文件的絕對路徑名(定義形式:驅動器 + 路徑 + 基本名稱 + 文件擴展名)。

            $(TargetName)

            生成的主輸出文件的基本名稱。

            $(TargetFileName)

            生成的主輸出文件的文件名(定義為基本名稱 + 文件擴展名)。

            $(TargetExt)

            生成的主輸出文件的文件擴展名。它在文件擴展名的前面包括“.”。

            $(VSInstallDir)

            安裝 Visual Studio .NET 的目錄。

            $(VCInstallDir)

            安裝 Visual C++ .NET 的目錄。

            $(FrameworkDir)

            安裝 .NET Framework 的目錄。

            $(FrameworkVersion)

            Visual Studio 使用的 .NET Framework 版本。與 $(FrameworkDir) 相結合,就是 Visual Studio 使用的 .NET Framework 版本的完整路徑。

            $(FrameworkSDKDir)

            安裝 .NET Framework SDK 的目錄。.NET Framework SDK 可作為 Visual Studio .NET 的一部分安裝,也可單獨安裝。

            $(WebDeployPath)

            從 Web 部署根到項目輸出所屬于的位置的相對路徑。返回與 RelativePath 相同的值。

            $(WebDeployRoot)

            指向 <localhost> 位置的絕對路徑。例如,c:\inetpub\wwwroot。

            $(SafeParentName)

            有效名稱格式的直接父級的名稱。例如,窗體是 .resx 文件的父級。

            $(SafeInputName)

            作為有效類名的文件的名稱,但不包括文件擴展名。

            $(SafeRootNamespace)

            項目向導將在其中添加代碼的命名空間名稱。此命名空間名稱將只包含在有效的 C++ 標識符中允許的字符。

            $(FxCopDir)

            fxcop.cmd 文件的路徑。fxcop.cmd 文件不和所有的 Visual C++ 版本一起安裝。

            posted @ 2012-03-08 11:34 多彩人生 閱讀(2245) | 評論 (0)編輯 收藏

            被忽視的

            被忽視的,只到用時才注意到
            1
            頭文件中用using namespace XXX;會使所有包含該頭文件的文件都被包含在名詞空間XXX中。
            在頭文件中應該全部用XXX::。

            posted @ 2012-03-08 11:19 多彩人生 閱讀(227) | 評論 (0)編輯 收藏

            僅列出標題
            共25頁: First 17 18 19 20 21 22 23 24 25 

            導航

            統計

            常用鏈接

            留言簿(3)

            隨筆分類

            隨筆檔案

            搜索

            最新評論

            閱讀排行榜

            評論排行榜

            久久精品一区二区影院| 久久久久人妻一区二区三区| 久久AV高清无码| 国产A级毛片久久久精品毛片| 热久久这里只有精品| 亚洲第一永久AV网站久久精品男人的天堂AV| 一本色道久久88综合日韩精品 | 久久99精品九九九久久婷婷| 国产精品热久久毛片| 精品一二三区久久aaa片| 久久国产成人精品麻豆| 亚洲精品成人网久久久久久| 久久久久人妻精品一区| 久久久久国色AV免费看图片| 性欧美丰满熟妇XXXX性久久久| 色综合久久久久| 日韩精品无码久久久久久| 国产99久久九九精品无码| 色综合久久无码中文字幕| 久久99精品国产麻豆不卡| 激情伊人五月天久久综合 | 国产成人精品久久| 精品久久久久久国产牛牛app| 日韩精品久久无码人妻中文字幕| 亚洲国产精品一区二区三区久久 | 精品久久久久久国产| 亚洲人成电影网站久久| 久久99精品国产麻豆婷婷| 久久免费高清视频| 久久国产色AV免费观看| 99精品国产综合久久久久五月天| 久久午夜福利电影| 久久人人爽人人爽AV片| 国产精品久久久久久久久久免费| 久久99热精品| 久久久久四虎国产精品| 久久无码av三级| 成人a毛片久久免费播放| 成人精品一区二区久久| 99久久亚洲综合精品网站| 四虎国产精品免费久久5151|