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

             

            Boost 1.46.1編譯成VS2008版本

            今天Boost.org上下載了Boost的最新版本1.46.1,然后編譯成VS2008的可用版本,總耗時大概20分鐘左右。步驟如下:

            1. 至Boost.org上下載Window下的Boost最新版 http://sourceforge.net/projects/boost/files/boost/1.46.1/ PS: 我下載的后綴為.7z的壓縮版本。

            2. 解壓至本地硬盤,我解壓在D:/boost_1_46_1下。

            3. 編譯得到bjam.exe. 進入VS2008的Command Prompt,(一定要是這個,不能是cmd)轉目錄至D:/boost_1_46_1/tools/build/v2,然后執行批處理bootstrap.bat后,得到bjam.exe, 將其拷至Boost根目錄下(即:D:/boost_1_46_1)

            4. 利用bjam.exe編譯得到Boost的lib文件。將VS2008的Command Prompt的執行目錄轉至D:/boost_1_46_1,然后輸入:bjam --toolset=msvc-9.0 --build-type=complete stage 后開始編譯,大概20分鐘后,編譯完成。生成的庫文件位于D:/boost_1_46_1/stage/lib下。

            5. 在VS2008中,設置include路徑和lib路徑后,即可使用Boost最新版。


            注:如果第4步僅輸入bjam或直接點擊bjam.exe執行,則生成的庫文件為VS2010的庫文件(形如:boost_filesystem-vc100-mt-1_46_1.lib).



            /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

            VS2008下直接安裝使用Boost庫1.46.1版本

            分類: 1.1 C/C++ 2711人閱讀 評論(10) 收藏 舉報

                  Boost庫是一個可移植、提供源代碼的C++庫,作為標準庫的后備,是C++標準化進程的發動機之一。 Boost庫由C++標準委員會庫工作組成員發起,其中有些內容有望成為下一代C++標準庫內容。在C++社區中影響甚大,是不折不扣的“準”標準庫。 Boost由于其對跨平臺的強調,對標準C++的強調,與編寫平臺無關。大部分boost庫功能的使用只需包括相應頭文件即可,少數(如正則表達式庫,文件系統庫等)需要鏈接庫。但Boost中也有很多是實驗性質的東西,在實際的開發中實用需要謹慎。boost 在一些播放軟件和音效中指增強,比如Bass Boost,低音增強。

            1.下載最新版的BOOST庫,當前最新版為1.46.1(2011-3-12發布),下載鏈接地址:http://sourceforge.net/projects/boost/files/boost/1.46.1/

            2.解壓到硬盤上,其目錄構造為

            boost_1_46_1/ ................................boost根目錄 
               index.htm ..................... www.boost.org 網站首頁 
               boost/ ..............................所有的Boost頭文件 
               lib/ .................................預編譯的二進制庫 
               libs/ ......................庫的Tests, .cpps, docs等等 
                 index.html .............................庫文檔開始處 
                 algorithm/ 
                 any/ 
                 array/ 
                                 …more libraries… 
               status/ .........................Boost-wide test suite 
               tools/ ...........實用工具, e.g. bjam, quickbook, bcp 
               more/ .......................................一些文檔 
               doc/ ...............................所有庫文檔的一部分 

            3.打開根目錄下的index.html,在上面的“Getting Started”有介紹怎么開始使用Boost的,大部分的Boost庫只需要包含頭文件即可,少部分需要編譯鏈接。以下是必須編譯的Boost庫:
                * Boost.Filesystem
                * Boost.GraphParallel
                * Boost.IOStreams
                * Boost.MPI
                * Boost.ProgramOptions
                * Boost.Python
                * Boost.Regex
                * Boost.Serialization
                * Boost.Signals
                * Boost.System
                * Boost.Thread
                * Boost.Wave
            另外,一些庫可以是可選擇編譯的:
                * Boost.DateTime (只有當你需要使用它的to_string/from_string或者serialization features, or if you're targeting Visual C++ 6.x or Borland.
                * Boost.Graph (只有當你傾向解析 GraphViz 文件)
                * Boost.Math (the TR1 and C99 cmath functions)
                * Boost.Random (當你需要使用random_device的時候)
                * Boost.Test (can be used in “header-only” or “separately compiled” mode)
            4.下面開始一個無需編譯Boost,直接使用頭文件的示例:
            ①打開Visual Studio 2008,新建Visual C++工程,基于Win32控制臺程序,工程名為example,確定之后,在彈出的對話框中“應用程序設置”打鉤上“控制臺應用程序”和“空項目”,點“完成”;
            ②在“解決方案資源管理器”右擊example工程,選擇“屬性”→“C/C++”→“常規”→“附加包含目錄”,輸入剛才解壓Boost的目錄,比如“F:/MyCode/BOOST/boost_1_46_1”,如下圖所示:

            ③右擊example工程下的“源文件”→“添加”→“新建項”→左邊的“代碼”→選中右邊的“C++文件(.cpp)”,文件名為example,點“添加”,輸入以下代碼:

            #include <boost/lambda/lambda.hpp> 
            #include <iostream> 
            #include <iterator> 
            #include <algorithm> 
             
            int main() 

                using namespace boost::lambda; 
                typedef std::istream_iterator<int> in; 
             
                std::for_each( 
                    in(std::cin), in(), std::cout << (_1 * 3) << " " ); 

            ④點擊菜單欄上“生成”→“生成解決方案”,正常的話會編譯通過,按F5可看結果,結果如下圖所示:

            這個example代碼的功能是從標準輸入中讀取一系列整型,然后使用boost::lambda使之每個數乘以3,再把結果寫進標準輸出。


            5.若是需要用到那些必須得編譯鏈接的庫,那么就得組建編譯Boost庫了。官方文檔上介紹說可以使用安裝版,或者自己編譯源代碼,特別介紹推薦在Microsoft Visual Studio開發環境下使用安裝版,因為安裝版可以直接下載,并且帶有預編譯好的庫,節省自己編譯源代碼的麻煩。在這里,因為我使用的是Visual Studio 2008,故欲試試使用安裝版。安裝版是boostpro網站制作的,安裝版不是跟官方的Boost同步的,會比較晚一些時間才會發布出來。當前最新版BoostPro 1.46.1 Installer (197K .exe),下載地址:http://www.boostpro.com/download/

            5.1運行安裝版,一路“I Agree”,注意會連接網絡,必須放行。之后會彈出選擇下載Boost C++庫1.46.1的鏡像地址,默認就好,繼續“Next”,彈出選擇默認的編譯類型,在左側選擇“Visual C++ 9”,在右側選擇類型,我們一般所用到的運行庫比較多使用多線程,可以在上面的example工程看屬性,如下圖所示:

            為此,我們只需選擇上面四個選項,再根據動態鏈接和靜態鏈接需求進行選擇,如下圖所示:

            接下去就是選擇組件安裝,沒啥問題就默認了,下一步選擇路徑,接著就開始下載了,如下圖所示:

            因為是連接網絡下載,所以得一段比較長的時間,下載完之后就會自動安裝好,在設定的目錄下就有個lib文件夾,里面就是編譯好的庫。
            5.2現在讓我們測試一下那些需要鏈接才能使用的庫:
            ①打開上面建立的example工程,將其cpp文件代碼改為如下:

            #include <boost/regex.hpp> 
            #include <iostream> 
            #include <string> 
             
            int main() 

                std::string line; 
                boost::regex pat( "^Subject: (Re: |Aw: )*(.*)" ); 
             
                while (std::cin) 
                { 
                    std::getline(std::cin, line); 
                    boost::smatch matches; 
                    if (boost::regex_match(line, matches, pat)) 
                        std::cout << matches[2] << std::endl; 
                } 

            此時,若是生成解決方案的話,就會提示 fatal error LNK1104: 無法打開文件“libboost_regex-vc90-mt-gd-1_46_1.lib”
            ②右鍵example解決方案,選擇“屬性”→“配置屬性”→“鏈接器”→“附加庫目錄”,添加安裝版下載好的lib庫文件夾路徑,如下圖所示:

            ③在菜單欄“生成”下拉選擇“生成解決方案”,無警告無錯誤通過。將下面文字保存成文本文檔,文件名為jayne.txt,內容如下:

            To: George Shmidlap 
            From: Rita Marlowe 
            Subject: Will Success Spoil Rock Hunter? 
            --- 
            See subject. 

            然后保存到工程目錄的Debug文件夾下。接著Win+R輸入CMD進入控制臺,cd 轉到此Debug目錄下,輸入example < jayne.txt命令,如下圖所示:

            回車之后,文本文檔里面Subject主題的內容就會被正則匹配出來,如下圖所示:

            也可以不進入CMD控制臺,直接在example解決方案右鍵“屬性”→“調試”→“命令參數”,輸入< jayne.txt ,按“確定”,直接Ctrl+F5運行程序,結果如下圖所示:


            6.最后總結,Visual Studio環境的話可以直接下載安裝版的,省去麻煩的編譯過程,但是不帶幫助文檔,這點得自己再從官方網站下載了,目前有漢化Boost文檔,還有一些不錯的中文站點,列舉如下:
            boost文檔漢化:http://code.google.com/p/boost-doc-zh/
            在線漢化版文檔:http://www.cppprog.com/boost_doc/

            posted @ 2012-03-02 21:01 多彩人生 閱讀(1831) | 評論 (0)編輯 收藏

            補習 size_t

            size_t是標準C庫中定義的,應為unsigned int。
              數據類型"socklen_t"和int應該具有相同的長度。否則就會破壞 BSD套接字層的填充.POSIX開始的時候用的是size_t, Linus Torvalds(他希望有更多的人,但顯然不是很多) 努力向他們解釋使用size_t是完全錯誤的,因為在64位結構中 size_t和int的長度是不一樣的,而這個參數(也就是accept函數的第三參數)的長度必須和int一致,因為這是BSD套接字接口標準.最終POSIX的那幫家伙找到了解決的辦法,那就是創造了一個新的類型"socklen_t".Linux Torvalds說這是由于他們發現了自己的錯誤但又不好意思向大家伙兒承認,所以另外創造了一個新的數據類型 。
              在C++中,設計 size_t 就是為了適應多個平臺的 。size_t的引入增強了程序在不同平臺上的可移植性。size_t是針對系統定制的一種數據類型,一般是整型,因為C/C++標準只定義一最低的位數,而不是必需的固定位數。而且在內存里,對數的高位對齊存儲還是低位對齊存儲各系統都不一樣。為了提高代碼的可移植性,就有必要定議這樣的數據類型。一般這種類型都會定義到它具體占幾位內存等。當然,有些是編譯器或系統已經給定義好的。經測試發現,在32位系統中size_t是4字節的,而在64位系統中,size_t是8字節的,這樣利用該類型可以增強程序的可移植性。
              一個基本的無符號整數的C / C + +類型。 它是sizeof操作符返回的結果類型。 該類型的大小是選擇,因此,它可以存儲在理論上是可能的任何類型的數組的最大大小。 在32位系統為size_t將采取32位和64位 - 64位。 換句話說,一個指針可以被安全地放進為size_t類型(一個例外是類的函數指針,但是這是一個特殊的情況下)。 為size_t類型通常用于循環,數組索引,大小的存儲和地址運算。 雖然為size_t可以存儲一個指針,它是更好地使用另一個unsinged整數類型uintptr_t形式,目的(它的名字反映了它的能力)。 在某些情況下,使用為size_t類型是更有效,比使用更無符號類型的程序員習慣性安全。
              size_t是一個無符號整數memsize基地型的C / C + +語言的標準庫中定義的。 此類型在C頭文件stddef.h,在文件cstddef中所述的C + +。 位于頭文件stddef.h中定義的類型在全局命名空間,而cstddef地方在命名空間std為size_t類型。 由于C語言的標準頭文件stddef.h納入的兼容性的目的,在這些方案中,您可以在全局命名空間的類型的C + +程序(:為size_t,為size_t)和命名空間std(STD::為size_t)。

            ============================
            主要是為了可移植用的
            typedef unsigned long size_t;
            typedef short pid_t;
            在其他平臺上有可能是 typedef unsigned int/long long size_t,         typedef long/int pid_t等等,,
            這樣就可以直接用size_t pid_t定義變量了,
            解釋以下pid_t的用法:
            主要用在linux c下進程管理中的,用它來表示進程的id類型,即表示進程表的索引(進程表里是進程id類型)

            posted @ 2012-03-01 20:38 多彩人生 閱讀(495) | 評論 (0)編輯 收藏

            Lua closure upvalue (轉)

            function是和數值、字符串同等地位的基本類型!

              Lua中的函數是一階類型值(first-class value),定義函數就象創建普通類型值一樣(只不過函數類型值的數據主要是一條條指令而已),所以在函數體中仍然可以定義函數。假設函數f2定義在函數f1中,那么就稱f2為f1的內嵌(inner)函數,f1為f2的外包 (enclosing)函數,外包和內嵌都具有傳遞性,即f2的內嵌必然是f1的內嵌,而f1的外包也一定是f2的外包。內嵌函數可以訪問外包函數已經創建的所有局部變量,這種特性便是所謂的詞法定界(lexical scoping),而這些局部變量則稱為該內嵌函數的外部局部變量(external  local variable)或者upvalue(這個詞多少會讓人產生誤解,因為upvalue實際指的是變量而不是值)。試看如下代碼:

              function f1(n)
              -- 函數參數也是局部變量
              
              local function f2()
              print(n) -- 引用外包函數的局部變量
              end
              return f2
              end
              
              g1 = f1(1979)
              g1() -- 打印出1979
              g2 = f1(500)
              g2() -- 打印出500
              
              當執行完g1 = f1(1979)后,局部變量n的生命本該結束,但因為它已經成了內嵌函數f2(它又被賦給了變量g1)的upvalue,所以它仍然能以某種形式繼續“存活”下來,從而令g1()打印出正確的值。
              
              可為什么g2與g1的函數體一樣(都是f1的內嵌函數f2的函數體),但打印值不同?這就涉及到一個相當重要的概念——閉包(closure)。事實上,Lua編譯一個函數時,會為它生成一個原型(prototype),其中包含了函數體對應的虛擬機指令、函數用到的常量值(數,文本字符串等等)和一些調試信息。在運行時,每當Lua執行一個形如function...end 這樣的表達式時,它就會創建一個新的數據對象,其中包含了相應函數原型的引用、環境(environment,用來查找全局變量的表)的引用以及一個由所有upvalue引用組成的數組,而這個數據對象就稱為閉包。由此可見,函數是編譯期概念,是靜態的,而閉包是運行期概念,是動態的。g1和g2的值嚴格來說不是函數而是閉包,并且是兩個不相同的閉包,而每個閉包可以保有自己的 upvalue值,所以g1和g2打印出的結果當然就不一樣了。雖然閉包和函數是本質不同的概念,但為了方便,且在不引起混淆的情況下,我們對它們不做區分。
              
              使用upvalue很方便,但它們的語義也很微妙,需要引起注意。比如將f1函數改成:
              
              function f1(n)
              local function f2()
              print(n)
              end
              n = n + 10
              return f2
              end
              
              g1 = f1(1979)
              g1() -- 打印出1989
              
              內嵌函數定義在n = n + 10這條語句之前,可為什么g1()打印出的卻是1989?upvalue實際是局部變量,而局部變量是保存在函數堆棧框架上(stack frame)的,所以只要upvalue還沒有離開自己的作用域,它就一直生存在函數堆棧上。這種情況下,閉包將通過指向堆棧上的 upvalue的引用來訪問它們,一旦upvalue即將離開自己的作用域(這也意味著它馬上要從堆棧中消失),閉包就會為它分配空間并保存當前的值,以后便可通過指向新分配空間的引用來訪問該upvalue。當執行到f1(1979)的n = n + 10時,閉包已經創建了,但是n并沒有離開作用域,所以閉包仍然引用堆棧上的n,當return f2完成時,n即將結束生命,此時閉包便將n(已經是1989了)復制到自己管理的空間中以便將來訪問。弄清楚了內部的秘密后,運行結果就不難解釋了。
              
              upvalue還可以為閉包之間提供一種數據共享的機制。試看下例:
              
              function Create(n)
              local function foo1()
              print(n)
              end
              
              local function foo2()
              n = n + 10
              end
              
              return foo1,foo2
              end
              
              f1,f2 = Create(1979)
              f1() -- 打印1979
              f2()
              f1() -- 打印1989
              f2()
              f1() -- 打印1999
              
              f1,f2這兩個閉包的原型分別是Create中的內嵌函數foo1和foo2,而foo1和foo2引用的upvalue是同一個,即Create的局部變量n。前面已說過,執行完Create調用后,閉包會把堆棧上n的值復制出來,那么是否f1和f2就分別擁有一個n的拷貝呢?其實不然,當Lua發現兩個閉包的upvalue指向的是當前堆棧上的相同變量時,會聰明地只生成一個拷貝,然后讓這兩個閉包共享該拷貝,這樣任一個閉包對該upvalue進行修改都會被另一個探知。上述例子很清楚地說明了這點:每次調用f2都將upvalue的值增加了10,隨后f1將更新后的值打印出來。upvalue的這種語義很有價值,它使得閉包之間可以不依賴全局變量進行通訊,從而使代碼的可靠性大大提高。
              
              閉包在創建之時其upvalue就已經不在堆棧上的情況也有可能發生,這是因為內嵌函數可以引用更外層外包函數的局部變量:
              
              function Test(n)
              local function foo()
              local function inner1()
              print(n)
              end
              local function inner2()
              n = n + 10
              end
              return inner1,inner2
              end
              return foo
              end
              
              t = Test(1979)
              f1,f2 = t()
              f1()        -- 打印1979
              f2()
              f1()        -- 打印1989
              g1,g2 = t()
              g1()        -- 打印1989
              g2()
              g1()        -- 打印1999
              f1()        -- 打印1999
              
              執行完t = Test(1979)后,Test的局部變量n就“死”了,所以當f1,f2這兩個閉包被創建時堆棧上根本找不到n的蹤影,這叫它們如何取得n的值呢?呵呵,不要忘了Test函數的n不僅僅是inner1和inner2的upvalue,同時它也是foo的upvalue。t =  Test(1979)之后,t這個閉包一定已經把n妥善保存好了,之后f1、f2如果在當前堆棧上找不到n就會自動到它們的外包閉包(姑且這么叫)的 upvalue引用數組中去找,并把找到的引用值拷貝到自己的upvalue引用數組中。仔細觀察上述代碼,可以判定g1和g2與f1和f2共享同一個 upvalue。這是為什么呢?其實,g1和g2與f1和f2都是同一個閉包(t)創建的,所以它們引用的upvalue(n)實際也是同一個變量,而剛才描述的搜索機制則保證了最后它們的upvalue引用都會指向同一個地方。
              
              Lua將函數做為基本類型值并支持詞法定界的特性使得語言具有強大的抽象能力。而透徹認識函數、閉包和upvalue將幫助程序員善用這種能力。

            posted @ 2012-02-28 20:13 多彩人生 閱讀(2020) | 評論 (0)編輯 收藏

            Lua語言-安裝,編輯,編譯,運行指導

            既然開始學習Lua,就應該對它有個一個大體的了解,對于Lua語言的介紹可以看這里
            http://baike.baidu.com/view/416116.htm【百度百科】
            英文好的朋友也可以直接到Lua官方[url=javascript:;]網站[/url]去了解更多的內容
            http://www.lua.org【Lua官方網站】
            這次主要介紹一下學習Lua之前的準備工作。
            (1) 下載Lua壓縮包,下載頁面是http://www.lua.org/download.html 最新版本是lua-5.1.2
            也可以點擊這里直接下載:http://www.lua.org/ftp/lua-5.1.2.tar.gz 它的體積很小,只有210K
            (2)解壓文件,比如解壓到 D:/lua-5.1.2 文件夾內(以下均以此路徑為例)。
            (3)在 D:/lua-5.1.2 內,存在名為 /etc 的子目錄。在此目錄下找到 luavs.bat 文件,并將它復制到 D:/lua-5.1.2 中。
            (4)雙擊執行 luavs.bat 批處理文件,如果執行成功,在 D:/lua-5.1.2/src 文件夾中會存在 luac.exe lua.exe兩個文件。
            (5)將 D:/lua-5.1.2/src 加入到系統路徑中。
            (6)檢測Lua是否安裝成功:
            在"開始"--"運行"處輸入 lua 然后回車,若出現cmd控制臺界面且含有"[backcolor=rgb(255,]Lua 5.1.2"之類的文字,則說明Lua已經成功安裝。如果提示沒有找到該命令,請檢查D:/lua-5.1.2/src 文件夾中是否存在 luac.exe lua.exe 兩個文件,并確保已將 D:/lua-5.1.2/src 加入到系統路徑中。
            (7)打造一個簡單的Lua編輯器:
            這里我使用EditPlus 最新版本的下載頁面:http://www.onlinedown.net/soft/7116.htm 【華軍軟件園】
            根據個人習慣可以選擇漢化版本或者英文原版,這里我以英文原版進行說明。
            安裝上EditPlus第一次運行時,需要輸入注冊碼或試用30天。在網上搜得注冊碼如下:
            Namewww.cnzz.cc
            Code60A8E-21F10-5BZ83-ADW4E-F3TC9

            我使用的版本是 EditPlus 2.31 Build 524,以上注冊碼可以使用。
            注冊成功后,打開 EditPlus,選擇Tools -- Preferences ,選擇setting & syntax,點擊右面的Add 按鈕增加一個文件類型,在下面的Descrīption欄里填寫Lua[backcolor=rgb(255,]FIle extension欄里填寫lua。注意到下面還有一欄可以選擇Syntax File,這是提供Lua語法文件的地方。有了它,可以讓EditPlus支持lua代碼的高亮關鍵字顯示。這個高亮支持代碼可以在網上搜到,做成后綴名為[backcolor=rgb(255,]stx的文件就可以了。
            我已經將lua.stx文件上傳到csdn資源,下載地址http://download.csdn.net/source/257667【CSDN資源】
            再選擇左面的User tools選項,點擊右面的Add Tool -- Program
            之后,在Menu Text一欄中填入 Run_Lua
            Command一欄中填入 lua
            Argument一欄中填入$(FileName)
            Initial directory一欄中填入$(FileDir)
            更改所有設置之后,不要忘記點擊[backcolor=rgb(255,]Apply應用,然后點擊OK
            選擇File -- New -- Others... ,然后選擇我們剛剛新創建的Lua文件,寫入一行代碼如下:
            print("Hello,Lua")
            然后保存一下。選擇Tools菜單,最下面有自定義命令Run_Lua,點擊此命令即可完成lua文件的執行(或者用快捷鍵 Ctrl + 1)。執行結果是彈出一個寫有Hello,Lua的控制臺。
            至此,學習Lua的準備工作完畢,可以正式開始學習了。

            posted @ 2012-02-16 22:52 多彩人生 閱讀(4968) | 評論 (0)編輯 收藏

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

            導航

            統計

            常用鏈接

            留言簿(3)

            隨筆分類

            隨筆檔案

            搜索

            最新評論

            閱讀排行榜

            評論排行榜

            一日本道伊人久久综合影| 日韩中文久久| 91精品国产乱码久久久久久| 国产精品99久久精品| 久久99精品久久久久久噜噜 | 精品永久久福利一区二区| 国产精品久久久久久搜索| 99久久精品国产一区二区| 久久人妻少妇嫩草AV蜜桃| 久久久久中文字幕| 欧美日韩精品久久免费| www久久久天天com| 久久电影网| 亚洲人成精品久久久久| 7国产欧美日韩综合天堂中文久久久久 | 天天综合久久一二三区| 久久精品中文闷骚内射| 色婷婷综合久久久久中文字幕 | 中文无码久久精品| 久久黄视频| 99久久人妻无码精品系列蜜桃| 午夜精品久久久久成人| 久久无码av三级| 精品国产乱码久久久久久郑州公司| 久久九九免费高清视频| 色综合久久久久网| 精品无码久久久久久尤物| 久久精品国产亚洲av麻豆图片| 久久久久无码专区亚洲av| 国产亚洲精久久久久久无码AV| 久久不见久久见免费视频7| 亚洲综合日韩久久成人AV| 亚洲国产精品无码久久青草| 久久se精品一区二区影院| 日本久久久精品中文字幕| 久久精品国产99国产精偷 | 久久精品人人做人人妻人人玩| 无码任你躁久久久久久| 香蕉久久永久视频| 亚洲国产成人精品久久久国产成人一区二区三区综 | 久久久噜噜噜www成人网|