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

            Error

            C++博客 首頁 新隨筆 聯(lián)系 聚合 管理
              217 Posts :: 61 Stories :: 32 Comments :: 0 Trackbacks

            #

            int *p = new int[10]; delete [] p; 既然 delete 時無需提供數(shù)組大小,那么顯然編譯器是知道數(shù)組的大小(或者說界限的)。 那么 編譯器是如何知道數(shù)組大小的?(比如維護了一張表、按特定格式存儲……) 既然知道數(shù)組大小,編譯器能否自動檢查數(shù)組越界的情況?不檢查是否是為了性能? 編程時如何利用這份信息? 另外,不借助搜索引擎如何解答這個問題,有類似文檔之類的東西可以參考嗎?修改 1:拿msvc來說,在new/malloc返回的ptr前n個字節(jié)里保存了大小,msvc還可以用_msize()來獲得size,具體保存在哪可以調(diào)試看看; 2:編譯器未必知道,有些size是運行時決定的.真正記錄大小是在運行時,而不是編譯期.數(shù)組越界不能自動檢查,ptr + offset,這種方式程序無法知道程序員的本意要訪問的到底是不是數(shù)組那塊內(nèi)存 3:特定環(huán)境下可能有用啊.(例:一個妹子問我在vs里怎么通過一個new出來的指針獲得size,然后就可以利用這些信息換妹子崇拜的眼神) PS:上調(diào)試器. 作者:吉林小伙 鏈接:https://www.zhihu.com/question/27112272/answer/35301722 來源:知乎 著作權歸作者所有。商業(yè)轉載請聯(lián)系作者獲得授權,非商業(yè)轉載請注明出處。 1:new的時候已經(jīng)多new了點空間把長度寫進去了 2:不能檢查,因為不是所有的指針都是new出來,誰知道到底指向的是什么 3:根據(jù)C++標準的話,沒辦法利用 4:反正VC++已經(jīng)98%以上跟標準完全一致了,而且gcc跟clang的私貨也不比VC++少,你去msdn看C++語法手冊就好了 C++ Language Reference,手冊只要你讀兩遍,你就什么都明白了。我初三就是讀了兩遍VC++5.0時代的msdn的語法手冊學會C++的。當然要熟悉還是要靠練習,光讀的話就算都記住了,也只能一知半解。 作者:vczh 鏈接:https://www.zhihu.com/question/27112272/answer/35291952 來源:知乎 著作權歸作者所有。商業(yè)轉載請聯(lián)系作者獲得授權,非商業(yè)轉載請注明出處。
            posted @ 2016-03-22 10:21 Enic 閱讀(409) | 評論 (0)編輯 收藏

            首先Ref不用解釋。
            cocos和常見的Ref或者智能指針稍微有點不一樣:
            首先介紹傳統(tǒng)玩法:
            傳統(tǒng)玩法Ref一般要配合RefPtr使用的,也就是new出來的Ref派生類引用計數(shù)為0,要放到一個RefPtr里邊來做生命周期管理。

            在來看看cocos的玩法:
            new出來Ref引用計數(shù)是為1的,那么問題來了,這樣如果Add和Release成對出現(xiàn)則Ref永遠回不到0了。
            cocos是這樣解決這個問題的:autorelease
            調(diào)用autorelease,會把當前Ref為1的對象壓入pool,然后在下一幀的調(diào)用release這樣就天下太平了,如果有add到其他節(jié)點上他就會變1,如果沒有就直接歸零析構了
            這樣就省掉了RefPtr操作


            為了保持風格統(tǒng)一,我也必須這樣玩,這樣的優(yōu)勢是不需要RefPtr,可能腳本綁定會方便不少吧
            posted @ 2016-03-15 20:52 Enic 閱讀(315) | 評論 (0)編輯 收藏

            WebSocket is an underlying network protocol that enables you to build other standard
            protocols on top of it.

            The WebSocket Protocol enables full duplex communication between a client and
            a remote server over the Web, and supports transmission of binary data and text strings.
            The protocol consists of an opening handshake followed by basic message framing, and is
            layered over TCP.


            WebSocket programming follows an asynchronous programming model, which
            means that as long as a WebSocket connection is open, your application simply listens
            for events. Your client does not need to actively poll the server for more information. To
            start listening for the events, you simply add callback functions to the WebSocket object.
            Alternatively, you can use the addEventListener() DOM method to add event listeners
            to your WebSocket objects.
            A WebSocket object dispatches four different events:
            · Open
            · Message
            · Error
            · Close
            As with all web APIs, you can listen for these events using on<eventname> handler
            properties, as well as using the addEventListener(); method.

            ws.onopen
            ws.onmessage
            ws.onerror
            ws.onclose

            e.data instanceof Blob
            ws.binaryType = "blob"

            WebSocket objects have two methods: send() and close()


            Listing 2-12. Waiting for the Open Event Before Sending a Message
            // Wait until the open event before calling send().
            var ws = new WebSocket("ws://echo.websocket.org")
            ws.onopen = function(e) {
            ws.send("Initial data");
            }

            Listing 2-13. Checking the readyState Property for an Open WebSocket
            // Handle outgoing data. Send on a WebSocket if that socket is open.
            function myEventHandler(data) {
            if (ws.readyState === WebSocket.OPEN) {
            // The socket is open, so it is ok to send the data.
            ws.send(data);
            } else {
            // Do something else in this case.
            //Possibly ignore the data or enqueue it.
            }
            }


            // Send a Blob
            var blob = new Blob("blob contents");
            ws.send(blob);
            // Send an ArrayBuffer
            var a = new Uint8Array([8,6,7,5,3,0,9]);
            ws.send(a.buffer);


            Listing 2-15. Calling the close() Method
            // Close the WebSocket connection
            ws.close();
            You can optionally pass two arguments to the close() method: code (a numerical
            status code) and reason (a text string). Passing these arguments transmits information
            to the server about why the client closed the connection. We will discuss the status
            codes and reasons in greater detail in Chapter 3, when we cover the WebSocket closing
            handshake. Listing 2-16 shows an example of calling the close() method with an
            argument.
            Listing 2-16. Calling the close() Method with a Reason
            // Close the WebSocket connection because the session has ended successfully
            ws.close(1000, "Closing normally");
            Listing 2-16 uses code 1000, which means, as it states in the code, that the
            connection is closing normally.


            WebSocket Object Attributes
            There are several WebSocket Object attributes you can use to provide more information
            about the WebSocket object: readyState, bufferedAmount, and protocol.

            Table 2-1. readyState Attributes, Values, and Status Descriptions
            Attribute Constant     Value     Status
            WebSocket.CONNECTING   0   The connection is in progress but has not been established.
            WebSocket.OPEN   1   The connection has been established. Messages can flow between the client and server.
            WebSocket.CLOSING   2   The connection is going through the closing handshake.
            WebSocket.CLOSED   3   The connection has been closed or could not be opened.

            WebSocket Object Attribute: protocol
            The protocol attribute is the empty string before the
            opening handshake completes and remains an empty string if the server does not choose
            one of the protocols offered by the client.

             

            posted @ 2016-02-22 17:02 Enic 閱讀(283) | 評論 (0)編輯 收藏

            GDI+使用雙緩沖繪圖
            ————————————————————————
            我再來詳細解釋一下剛才實現(xiàn)雙緩沖的具體步驟:
            1、在內(nèi)存中建立一塊“虛擬畫布”:
            Bitmap bmp = new Bitmap(600, 600);
            2、獲取這塊內(nèi)存畫布的Graphics引用:
            Graphics g = Graphics.FromImage(bmp);
            3、在這塊內(nèi)存畫布上繪圖:
            g.FillEllipse(brush, i * 10, j * 10, 10, 10);
            4、將內(nèi)存畫布畫到窗口中
            this.CreateGraphics().DrawImage(bmp, 0, 0);
            ====================
            maybe better
            CDC dcMemory;
            dcMemory.CreateCompatibleDC(&dc);
            CBitmap bmp;
            bmp.CreateCompatibleBitmap(&dc,1024,768);
            dcMemory.SelectObject(&bmp);
               
            Graphics _Graphics(dcMemory.m_hDC);
            _Graphics.DrawImage(_pImage,0,0,1024,768);
            //這是在GDI+中的寫法。
               
            dc.BitBlt(0,0,1024,768,&dcMemory,0,0,SRCCOPY);
               
            _Graphics.ReleaseHDC(dcMemory.m_hDC);
            dcMemory.DeleteDC();
            bmp.DeleteObject(); 



            -------------------------------------------------------------------------
            補充:
            1.對于GDI常見的做法都是MemDC一下不解釋了
            2.GDI+似乎也可以用MemDC生成一個graphics,然后畫好了,在把MemDC bit到WndDC上,但是會有各種各樣的問題。
            3.不管是那種方式,都是一個宗旨:直接操作前臺屏幕上的DC在繪圖的過程中會顯得比較慢,所以生成一個內(nèi)存畫布,把所有的貼圖操作都在不可見的內(nèi)存畫布上操作完成,然后一次性貼圖到前臺DC上。這樣實際上還多了一次貼圖,但是對于前臺DC的操作已經(jīng)是無限小了。
            4.GDI+還有一種更優(yōu)的方式:創(chuàng)建一個內(nèi)存bitmap,然后從內(nèi)存bitmap創(chuàng)建出GDI+位圖,然后使用做個位圖作為渲染畫布。渲染完成后,在直接把bitmap貼圖到前臺DC上面來,內(nèi)存中的bitmap是復用的,不用在每個渲染事件中重新創(chuàng)建。
            5.為了更好的GL或者其他的渲染接口融合,基于bitmap的內(nèi)存畫布應該是最優(yōu)的做法。




            posted @ 2015-11-12 14:28 Enic 閱讀(426) | 評論 (0)編輯 收藏

            數(shù)據(jù)庫備份實例/** 
            **數(shù)據(jù)庫備份實例 
            **朱二 2004年5月 
            **備份策略: 
            **數(shù)據(jù)庫名:test 
            **備份文件的路徑e:\backup 
            **每個星期天凌晨1點做一次完全備份,為保險起見,備份到兩個同樣的完全備份文件test_full_A.bak和test_full_B.bak 
            **每天1點(除了星期天)做一次差異備份,分別備份到兩個文件test_df_A.bak和test_df_B.bak(采用附加到原備份的方式) 
            **每一個小時做一次事務日志備份,分別備份到兩個文件test_log_A.bak和test_log_B.bak(采用附加到原備份的方式) 
            **/ 


            --第一 完全備份部分 
            --新增作業(yè) 
            EXEC sp_add_job @job_name = '完全備份' 
            --新增作業(yè)步驟1,把數(shù)據(jù)庫備份到test_full_backup_A.bak 
            EXEC sp_add_jobstep @job_name = '完全備份', 
            @step_name = 'Setp1', 
            @subsystem = 'TSQL', 
            @command = 'BACKUP DATABASE Test TO DISK=''e:\backup\test_full_A.bak'' WITH INIT', 
            @on_fail_action=3, --失敗后轉到下一步 
            @on_success_action=3,-- 成功后轉到下一步 
            @retry_attempts = 5, 
            @retry_interval = 5 

            --新增作業(yè)步驟2,把數(shù)據(jù)庫備份到test_full_B.bak 
            EXEC sp_add_jobstep @job_name = '完全備份', 
            @step_name = 'Setp2', 
            @subsystem = 'TSQL', 
            @command = 'BACKUP DATABASE Test TO DISK=''e:\backup\test_full_B.bak'' WITH INIT', 
            @retry_attempts = 5, 
            @retry_interval = 5 

            --調(diào)度 
            EXEC sp_add_jobschedule @job_name = '完全備份', 
            @name = 'Schedule_1', 
            @freq_type = 8, -- 按周 
            @freq_interval = 1, --每星期天執(zhí)行 
            @freq_recurrence_factor=1, 
            @active_start_time = 10000 --開始時間: 凌晨1點 
            --第二 差異備份部分 
            --新增作業(yè) 
            EXEC sp_add_job @job_name = '差異備份' 
            --新增作業(yè)步驟1,把數(shù)據(jù)庫備份到test_df_A.bak 
            EXEC sp_add_jobstep @job_name = '差異備份', 
            @step_name = 'Setp1', 
            @subsystem = 'TSQL', 
            @command = 'BACKUP DATABASE Test TO DISK=''e:\backup\test_df_A.bak'' WITH DIFFERENTIAL', 
            @on_fail_action=3, --失敗后轉到下一步 
            @on_success_action=3,-- 成功后轉到下一步 
            @retry_attempts = 5, 
            @retry_interval = 5 

            --新增作業(yè)步驟2,把數(shù)據(jù)庫備份到test_df_B.bak 
            EXEC sp_add_jobstep @job_name = '差異備份', 
            @step_name = 'Setp2', 
            @subsystem = 'TSQL', 
            @command = 'BACKUP DATABASE Test TO DISK=''e:\backup\test_df_B.bak'' WITH DIFFERENTIAL', 
            @retry_attempts = 5, 
            @retry_interval = 5 

            --調(diào)度 
            EXEC sp_add_jobschedule @job_name = '差異備份', 
            @name = 'Schedule_1', 
            @freq_type = 8, -- 按周 
            @freq_interval = 126, --星期一至星期六 
            @freq_recurrence_factor=1, 
            @active_start_time = 10000 --開始時間: 凌晨1點 


            --第二 事務備份部分 
            --新增作業(yè) 
            EXEC sp_add_job @job_name = '事務備份' 
            --新增作業(yè)步驟1,把數(shù)據(jù)庫備份到test_log_A.bak 
            EXEC sp_add_jobstep @job_name = '事務備份', 
            @step_name = 'Setp1', 
            @subsystem = 'TSQL', 
            @command = 'BACKUP LOG Test TO DISK=''e:\backup\test_log_A.bak''', 
            @on_fail_action=3, --失敗后轉到下一步 
            @on_success_action=3,-- 成功后轉到下一步 
            @retry_attempts = 5, 
            @retry_interval = 5 

            --新增作業(yè)步驟2,把數(shù)據(jù)庫備份到test_log_B.bak 
            EXEC sp_add_jobstep @job_name = '事務備份', 
            @step_name = 'Setp2', 
            @subsystem = 'TSQL', 
            @command = 'BACKUP LOG Test TO DISK=''e:\backup\test_log_B.bak''', 
            @retry_attempts = 5, 
            @retry_interval = 5 

            --調(diào)度 
            EXEC sp_add_jobschedule @job_name = '事務備份', 
            @name = 'Schedule_1', 
            @freq_type = 4, -- 按天 
            @freq_interval=1,--每一天 
            @freq_subday_type=8, --按小時 
            @freq_subday_interval=1 --每一個小時 
            posted @ 2015-09-06 09:33 Enic 閱讀(198) | 評論 (0)編輯 收藏

            bpack=string.pack
            bunpack=string.unpack
            -- 輸出二進制
            function hex(s)
             s=string.gsub(s,"(.)",function (x) return string.format("%02X",string.byte(x)) end)
             return s
            end
            --解包傳入的是hex和FMT(><大小端),輸出是FMT指定的類型:i int, n lua_num
            --i=12345 f="i"
            --a=bpack(f,i,i,i)
            --print(hex(a))
            --print(bunpack(a,f))
            --打包輸入fmt,實際類型,輸出hex
            local n = 0x12345678
            --tb = {}
            --dump(tb)
            --tb = n
            --dump(tb)
            a = bpack('>n', n)
            dump(hex(a))
            posted @ 2015-09-01 18:30 Enic 閱讀(334) | 評論 (0)編輯 收藏

            --如何定義枚舉
            --下面的函數(shù)實現(xiàn):
            --轉換 EnumTable = {1:Enum1, 2:Enum2}
            --到   EnumTable = {Enum1:1, Enum2:2}
            function CreateEnumTable(tb, indexStart)
                --assert(IsTable(tb))
                local enumTB = {}
                local enumIndex = indexStart or 0
                
                --轉換字符table到枚舉table
                for index, value ipairs(tb) do
                    enumTB[v] = enumIndex + index
                end
                return enumTB
            end
            --只是返回值而已和C不一樣
            assert(0)
            --用這個和字符串比較實現(xiàn)判斷變量類型
            print(type(CreateEnumTable))
            --xpcall可以保護執(zhí)行一個函數(shù),通過返回值確定異常情況
            posted @ 2015-09-01 17:29 Enic 閱讀(901) | 評論 (0)編輯 收藏

            VC++ Runtime Error 異常捕獲之不掛的程序

             很多軟件通過設置自己的異常捕獲函數(shù),捕獲未處理的異常,生成報告或者日志(例如生成mini-dump文件),達到Release版本下追蹤Bug的目的。但是,到了VS2005(即VC8),Microsoft對CRT(C運行時庫)的一些與安全相關的代碼做了些改動,典型的,例如增加了對緩沖溢出的檢查。新CRT版本在出現(xiàn)錯誤時強制把異常拋給默認的調(diào)試器(如果沒有配置的話,默認是Dr.Watson),而不再通知應用程序設置的異常捕獲函數(shù),這種行為主要在以下三種情況出現(xiàn)。

            (1)       調(diào)用abort函數(shù),并且設置了_CALL_REPORTFAULT選項(這個選項在Release版本是默認設置的)。

            (2)       啟用了運行時安全檢查選項,并且在軟件運行時檢查出安全性錯誤,例如出現(xiàn)緩存溢出。(安全檢查選項/GS 默認也是打開的)

            (3)       遇到_invalid_parameter錯誤,而應用程序又沒有主動調(diào)用

            _set_invalid_parameter_handler設置錯誤捕獲函數(shù)。

            所以結論是,使用VS2005(VC8)編譯的程序,許多錯誤都不能在SetUnhandledExceptionFilter捕獲到。這是CRT相對于前面版本的一個比較大的改變,但是很遺憾,Microsoft卻沒有在相應的文檔明確指出。

            解決方法

                   之所以應用程序捕獲不到那些異常,原因是因為新版本的CRT實現(xiàn)在異常處理中強制刪除所有應用程序先前設置的捕獲函數(shù),如下所示:

             /* Make sure any filter already in place is deleted. */

             SetUnhandledExceptionFilter(NULL);

             UnhandledExceptionFilter(&ExceptionPointers);

            解決方法是攔截CRT調(diào)用SetUnhandledExceptionFilter函數(shù),使之無效。在X86平臺下,可以使用以下代碼。

            #ifndef _M_IX86

                   #error "The following code only works for x86!"

            #endif

             

            void DisableSetUnhandledExceptionFilter()

            {

                void *addr = (void*)GetProcAddress(LoadLibrary(_T("kernel32.dll")),

                                                                     "SetUnhandledExceptionFilter");

                if (addr)

                {

                          unsigned char code[16];

                          int size = 0;

                          code[size++] = 0x33;

                          code[size++] = 0xC0;

                          code[size++] = 0xC2;

                          code[size++] = 0x04;

                          code[size++] = 0x00;

             

                           DWORD dwOldFlag, dwTempFlag;

                          VirtualProtect(addr, size, PAGE_READWRITE, &dwOldFlag);

                          WriteProcessMemory(GetCurrentProcess(), addr, code, size, NULL);

                          VirtualProtect(addr, size, dwOldFlag, &dwTempFlag);

                   }

            }

            在設置自己的異常處理函數(shù)后,調(diào)用DisableSetUnhandledExceptionFilter禁止CRT設置即可。

            其它討論

                   上面通過設置api hook,解決了在VS2005上的異常捕獲問題,這種雖然不是那么“干凈”的解決方案,確是目前唯一簡單有效的方式。

                   雖然也可以通過_set_abort_behavior(0, _WRITE_ABORT_MSG | _CALL_REPORTFAULT), signal(SIGABRT, ...), 和_set_invalid_parameter_handler(...) 解決(1)(3),但是對于(2),設置api hook是唯一的方式。

            注:對于錯誤是否顯示錯誤提示框,可以使用SetErrorMode()


            后面又遇到WIN8.1上
            VirtualProtect報錯C0000005,最后還是想辦法解決了

            bool AdjustPrivileges() 
            {     
                HANDLE hToken;     
                TOKEN_PRIVILEGES tp;     
                TOKEN_PRIVILEGES oldtp;     
                DWORD dwSize=sizeof(TOKEN_PRIVILEGES);     
                LUID luid;       
                if (!OpenProcessToken(GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY, &hToken)) 
                {         
                    if (GetLastError()==ERROR_CALL_NOT_IMPLEMENTED) return true;         
                    else return false;     
                }     

                if (!LookupPrivilegeValue(NULL, SE_DEBUG_NAME, &luid)) 
                {        
                    CloseHandle(hToken);         
                    return false;     
                }     
                
                ZeroMemory(&tp, sizeof(tp));     
                tp.PrivilegeCount=1;     
                tp.Privileges[0].Luid=luid;     
                tp.Privileges[0].Attributes=SE_PRIVILEGE_ENABLED;     
                /* Adjust Token Privileges */    
                if (!AdjustTokenPrivileges(hToken, FALSE, &tp, sizeof(TOKEN_PRIVILEGES), &oldtp, &dwSize)) 
                {        
                    CloseHandle(hToken);         
                    return false;     
                }     
                
                // close handles     
                CloseHandle(hToken);     
                return true



            void DisableSetUnhandledExceptionFilter()

            {

                void *addr = (void*)GetProcAddress(LoadLibrary(_T("kernel32.dll")),

                    "SetUnhandledExceptionFilter");

                if (addr)

                {

                    unsigned char code[16];

                    int size = 0;

                    code[size++] = 0x33;

                    code[size++] = 0xC0;

                    code[size++] = 0xC2;

                    code[size++] = 0x04;

                    code[size++] = 0x00;

                    //SetProcessDEPPolicy(1);

                    DWORD dwOldFlag, dwTempFlag;

                    // win8.1下用百度找了下PAGE_READWRITE崩潰,實際測試提升debug權限,SetProcessDEPPolicy(1);都無效,改成PAGE_EXECUTE_READWRITE生效
                    
            //VirtualProtect(addr, size, PAGE_READWRITE, &dwOldFlag);
                    VirtualProtect(addr, size, PAGE_EXECUTE_READWRITE, &dwOldFlag);
                    WriteProcessMemory(GetCurrentProcess(), addr, code, size, NULL);

                    VirtualProtect(addr, size, dwOldFlag, &dwTempFlag);

                }

            }



            posted @ 2015-08-28 11:14 Enic 閱讀(723) | 評論 (0)編輯 收藏

            在下面的章節(jié)中, 你將會學到如何用 Apache, Tomcat 和微軟的 IIS 創(chuàng)建 MIME 類型.

            " src="/CuteSoft_Client/CuteEditor/Images/anchor.gif">用 Apache 創(chuàng)建 MIME 類型

            在 Apache 里, MIME 類型和文件擴展名之間的映射是被存放在配置文件 "apache根目錄/conf/mime.types" 里的 (對于大多數(shù) LINUX 系統(tǒng), 是放在 /etc/apache2/mods-available 里的), 這里的 "apache根目錄" 是 Apache 在你的服務器上的安裝路徑.

            要創(chuàng)建 MIME 類型, 打開 mime.types 文件. 以 # 字符開頭的行是注釋行, Apache 會忽略它們. 其它每行都以某種 MIME 類型開頭, 然后跟著一種或多種文件擴展名. 其形式如下:

            mime類型 文件擴展名1 文件擴展名2 文件擴展名3 ... 

            下面是一些例子:

            text/html html htm application/vnd.wap.xhtml+xml xhtml text/vnd.wap.wml wml text/vnd.wap.wmlscript wmls image/vnd.wap.wbmp wbmp 

            " src="/CuteSoft_Client/CuteEditor/Images/anchor.gif">用 Tomcat 創(chuàng)建 MIME 類型

            在 Tomcat 5.x 和 4.x 里, MIME 類型和文件擴展名之間的缺省映射是被存放在文件 tomcat根目錄/conf/web.xml 里的, 這里的 "tomcat根目錄" 是 Tomcat 在你的服務器上的安裝目錄. 該文件里所指定的映射會被應用到你的 Tomcat 服務器所運行的所有 Web/WAP 應用程序上. 針對應用程序的映射應該 Web/WAP 應用的目錄里的 WEB-INF/web.xml 文件里設置.

            每種映射都要用 <mime-mapping>, <extension> 和 <mime-type> 標簽來指定. 下面就是一個例子:

            <web-app> ...    <mime-mapping>     <extension>xhtml</extension>     <mime-type>application/vnd.wap.xhtml+xml</mime-type>   </mime-mapping>    <mime-mapping>     <extension>wml</extension>     <mime-type>text/vnd.wap.wml</mime-type>   </mime-mapping>    <mime-mapping>     <extension>wmls</extension>     <mime-type>text/vnd.wap.wmlscript</mime-type>   </mime-mapping>    <mime-mapping>     <extension>wbmp</extension>     <mime-type>image/vnd.wap.wbmp</mime-type>   </mime-mapping>  ... </web-app> 

            " src="/CuteSoft_Client/CuteEditor/Images/anchor.gif">用微軟的 IIS 創(chuàng)建 MIME 類型

            微軟的 IIS 提供了一個創(chuàng)建 MIME 類型的圖形界面. 下面列出了在 Windows Server 2003 上用 IIS 6.0 創(chuàng)建 MIME 類型步驟:

               1. 打開 IIS 窗口: 選擇 控制面板 -> 管理工具 -> Internet 服務管理器.
               2. 在左手邊的樹狀結構中, 你應當可以看到其中有一項標題為你的計算機的名字. 在其上點右鍵, 會彈出一個菜單.
               3. 點擊菜單中的屬性, 打開屬性窗口.
               4. 點擊 "HTTP 頭" 選項卡, 下面有 "MIME 映射", 點擊 "文件類型" 按紐.
               5. 在 "文件類型" 窗口中, 你可以看到一個 MIME 映射的列表. 用標有 "新類型...", "刪除" 和 "編輯..."  的按紐作你想要的修改.

            在其它版本的 IIS 中創(chuàng)建 MIME 類型應該與此類似.

            posted @ 2015-08-21 16:25 Enic 閱讀(146) | 評論 (0)編輯 收藏

            使用CMake GCC和Clang的/ LLVM之間切換

            cmake llvm clang
            我公司擁有一批項目的CMake的,我希望能夠方便地切換GCC或鐺/ LLVM他們。我相信(請如果我錯了!)表示鏘我需要進行如下設置:
             SET (CMAKE_C_COMPILER    "/usr/bin/clang")  SET (CMAKE_C_FLAGS    "-Wall -std=c99")  SET (CMAKE_C_FLAGS_DEBUG   "-g")  SET (CMAKE_C_FLAGS_MINSIZEREL  "-Os -DNDEBUG")  SET (CMAKE_C_FLAGS_RELEASE  "-O4 -DNDEBUG")  SET (CMAKE_C_FLAGS_RELWITHDEBINFO "-O2 -g")  SET (CMAKE_CXX_COMPILER    "/usr/bin/clang++")  SET (CMAKE_CXX_FLAGS    "-Wall")  SET (CMAKE_CXX_FLAGS_DEBUG   "-g")  SET (CMAKE_CXX_FLAGS_MINSIZEREL  "-Os -DNDEBUG")  SET (CMAKE_CXX_FLAGS_RELEASE  "-O4 -DNDEBUG")  SET (CMAKE_CXX_FLAGS_RELWITHDEBINFO "-O2 -g")  SET (CMAKE_AR  "/usr/bin/llvm-ar")  SET (CMAKE_LINKER "/usr/bin/llvm-ld")  SET (CMAKE_NM  "/usr/bin/llvm-nm")  SET (CMAKE_OBJDUMP "/usr/bin/llvm-objdump")  SET (CMAKE_RANLIB "/usr/bin/llvm-ranlib") 
            是否有這些和默認的GCC變量之間的切換,最好是全系統(tǒng)的變化,而不是具體的項目(即不只是將它們添加到項目的的CMakeLists.txt)一個簡單的方法? 另外,是否有必要的llvm-*節(jié)目鐺的gcc時代替,而不是系統(tǒng)默認值?有什么區(qū)別?
            本文地址 :CodeGo.net/340772/ 
            ------------------------------------------------------------------------------------------------------------------------- 
            1. CMake的榮譽的變量CCCXX在檢測到C和C ++編譯器
            $ export CC=/usr/bin/clang $ export CXX=/usr/bin/clang++ $ cmake .. -- The C compiler identification is Clang -- The CXX compiler identification is Clang 
            具體標志可以通過將它們放入一個系統(tǒng)范圍的CMake文件并指向CMAKE_USER_MAKE_RULES_OVERRIDE變量,它被覆蓋。創(chuàng)建一個文件~/ClangOverrides.txt其內(nèi)容如下:
            SET (CMAKE_C_FLAGS_INIT    "-Wall -std=c99") SET (CMAKE_C_FLAGS_DEBUG_INIT   "-g") SET (CMAKE_C_FLAGS_MINSIZEREL_INIT  "-Os -DNDEBUG") SET (CMAKE_C_FLAGS_RELEASE_INIT  "-O4 -DNDEBUG") SET (CMAKE_C_FLAGS_RELWITHDEBINFO_INIT "-O2 -g") SET (CMAKE_CXX_FLAGS_INIT    "-Wall") SET (CMAKE_CXX_FLAGS_DEBUG_INIT   "-g") SET (CMAKE_CXX_FLAGS_MINSIZEREL_INIT  "-Os -DNDEBUG") SET (CMAKE_CXX_FLAGS_RELEASE_INIT  "-O4 -DNDEBUG") SET (CMAKE_CXX_FLAGS_RELWITHDEBINFO_INIT "-O2 -g") 
            后綴_init會讓CMake的初始化相應的*_FLAGS變量與給定的值。然后調(diào)用cmake的以下面的方式:
            $ cmake -DCMAKE_USER_MAKE_RULES_OVERRIDE=~/ClangOverrides.txt .. 
            終于到了LLVM的binutils力,設置內(nèi)部變量_CMAKE_TOOLCHAIN_PREFIX。這個變量是由榮幸CMakeFindBinUtils模塊:
            $ cmake -D_CMAKE_TOOLCHAIN_PREFIX=llvm- .. 
            把這個放在一起你可以寫一個shell包裝它設置了變量CCCXX然后調(diào)用cmake的可變覆蓋。 
            2. 全系統(tǒng)的C ++的變化對Ubuntu的: sudo用update-alternatives-配置C ++ 將打印是這樣的:
             Selection Path    Priority Status ------------------------------------------------------------ * 0   /usr/bin/g++  20  auto mode  1   /usr/bin/clang++ 10  manual mode  2   /usr/bin/g++  20  manual mode 
            然后,只需選擇鐺++。 
            3. 你的
            option(USE_CLANG "build application with clang" OFF) # OFF is the default 
            然后在包裹如果()S中的設置:
            if(USE_CLANG)  SET (...)  .... endif(USE_CLANG) 
            這樣,它會顯示為在GUI配置工具的cmake的選項。 為了讓您在整個系統(tǒng)可以在變量的默認值或保持與答案。 
            4. 你絕對不需要不同的LLVM-AR等程序:
            SET (CMAKE_AR  "/usr/bin/llvm-ar") SET (CMAKE_LINKER "/usr/bin/llvm-ld") SET (CMAKE_NM  "/usr/bin/llvm-nm") SET (CMAKE_OBJDUMP "/usr/bin/llvm-objdump") SET (CMAKE_RANLIB "/usr/bin/llvm-ranlib") 
            這些都是為了工作,對LLVM內(nèi)部格式,因此阿仁'到您的應用程序的生成。 作為一個說明 CodeGo.net,O4將在你的程序調(diào)用的LTO,你可能不希望(這樣會大大)和鐺默認為C99模式,使標志不是必需的兩種。 
            5. 你的語法:$ENV{environment-variable}在你的CMakeLists.txt訪問變量。你可以適當?shù)貏?chuàng)建一個初始化的變量集的腳本,只是在引用這些變量的CMakeLists.txt文件。
            posted @ 2015-08-20 11:52 Enic 閱讀(1440) | 評論 (0)編輯 收藏

            僅列出標題
            共22頁: 1 2 3 4 5 6 7 8 9 Last 
            国产精品伊人久久伊人电影| 国产99久久九九精品无码| 久久国产精品免费| 久久综合狠狠综合久久 | 久久久久99这里有精品10| 国产精品乱码久久久久久软件| 久久精品国产亚洲AV影院| 嫩草影院久久国产精品| 久久人人爽人人爽人人爽| 国产精品99久久久久久人| 国产成人无码精品久久久性色 | 人妻精品久久久久中文字幕一冢本| 久久精品中文闷骚内射| 亚洲国产欧洲综合997久久| 亚洲精品无码专区久久同性男| 青青草原综合久久| 久久精品成人欧美大片| 蜜臀久久99精品久久久久久| 国内精品伊人久久久久影院对白| 久久久久久久久66精品片| 久久精品国产清自在天天线| 久久九九久精品国产| 1000部精品久久久久久久久| 日韩精品久久久久久免费| 国产免费久久精品99re丫y| 狠狠色伊人久久精品综合网 | 93精91精品国产综合久久香蕉| 99久久这里只有精品| 久久夜色精品国产噜噜亚洲AV| 久久久久亚洲AV无码去区首| 久久er国产精品免费观看8| 久久精品国产亚洲AV无码娇色 | 人妻精品久久无码区| 色婷婷综合久久久久中文一区二区 | 国产成人精品综合久久久| 中文字幕无码久久精品青草 | 久久精品国产亚洲网站| 精品久久久久一区二区三区| 国产精品一久久香蕉国产线看| 久久综合给合久久狠狠狠97色69| 无码精品久久久久久人妻中字|