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

C/C++圖形圖像的世界

圖形與游戲編程

常用鏈接

統計

積分與排名

Blog

最新評論

C/C++宏的奇技淫巧

來源:http://blog.misakamm.org/p/209
宏的主要作用就是簡化代碼編寫,簡化一些需要重復編碼的地方,以得到看起來更優雅的代碼。但宏要用得好并不容易,用的不好很容易引發災難性的后果。本文會介紹宏比較偏門但又很實用的技巧。
首先就是最常用的技巧(http://blog.misakamm.org/p/209):
#define MACROCAT( x, y ) MACROCAT1 ( x, y )
#define MACROCAT1( x, y ) x##y
#define TOSTRING( s ) #s
MACROCAT把x和y展開后連結,而TOSTRING把s轉化為字符串,比如可以printf(TOSTRING(%s), TOSTRING(abcdefg));
然后,因為宏不能遞歸,但可以做遞歸模擬,我們可以這樣玩。比如要生成n位的二進制數并且從小到大構成的字符串(用到前面的宏):
#define BIN_0(arg) TOSTRING ( arg )
#define BIN_1(arg) BIN_0(MACROCAT(arg, 0)) "," BIN_0(MACROCAT(arg, 1))
#define BIN_2(arg) BIN_1(MACROCAT(arg, 0)) "," BIN_1(MACROCAT(arg, 1))
#define BIN_3(arg) BIN_2(MACROCAT(arg, 0)) "," BIN_2(MACROCAT(arg, 1))
#define BIN_4(arg) BIN_3(MACROCAT(arg, 0)) "," BIN_3(MACROCAT(arg, 1))
int main()
{
puts(BIN_4());
return 0;
}

這里要注意的是,比如BIN_2(),實際上展開的結果是
"0" "0" "," "0" "1" "," "1" "0" "," "1" "1"
不過c/c++規定這樣連寫的字符串,編譯時就會合并成一個,于是就能用puts直接完整輸出結果了
如果你想得到更多的位,很簡單,只要你不介意,上面的宏復制并改改數字就可以了
不過,這樣一改要改若干個數字,比較麻煩,能不能讓它工作得更好?比如只要改宏名?
這個時候,就要用更富有技巧性的一招了:讓每個宏多一個參數n,然后前面的BIN_x使用MACROCAT把它與數字連結起來,不就可以了么?
想法不錯,不過問題是宏本身沒有做減法的能力,能做的僅僅是替換。減1應該怎么實現呢?
其實不難,見以下定義:
#define DECVAL_1 0
#define DECVAL_2 1
#define DECVAL_3 2
#define DECVAL_4 3
#define DECVAL_5 4
#define DECVAL_6 5
#define DECVAL_7 6
#define DECVAL_8 7
#define DECVAL_9 8
#define DECVAL( n ) DECVAL_##n
好了,有了這個利器,我們就可以對原宏改造了,先拿0號和1號宏開刀:
#define BIN_0(n, arg) TOSTRING ( arg )
#define BIN_1(n, arg) MACROCAT(BIN_, DECVAL(n)) (DECVAL(n), MACROCAT(arg, 0)) \
"," MACROCAT(BIN_, DECVAL(n)) (DECVAL(n), MACROCAT(arg, 1))
看得懂替換了一些什么嗎?這樣,后面的2,3,4,5號,只要復制一下1號的定義,改一改宏名就解決問題了
思考題:
這里生成的二進制結果是帶前導0的,如何改寫能使生成的結果不帶前導0?
source: http://blog.misakamm.org/p/209

使用此法可以“遞歸”式生成很多類似代碼,同時這個技巧也非常的實用,但遞歸構造并不容易,需要編寫的人仔細想清楚,否則很容易出錯,特別要注意宏展開的時機,一般不直接使用MACROCAT1宏,因為那個很可能不是你想要的結果
之后,到C99標準出臺后(也就是說,下文內容與bc3/tc/vc6不兼容),宏里面多了一個狠角色:可變參數個數宏
比如可以 #define PRINTF(...) fprintf(stdout, __VA_ARGS__)
其中__VA_ARGS__代表了‘...’部分的全部參數,這樣可以輕松的重定義庫函數里不定參數的函數的輸出行為,比如printf重定向到文件(雖然也可以用freopen實現,但只想說明宏也可以這樣搞)
好了,下文將區分編譯器來介紹,一共分為兩派,vc派和gcc派(包括clang/objc),因為兩者對以下代碼的處理并不一致,需要使用略為不同的宏來實現,目前我也只遇到這兩派。
現在的目的是這樣,因為__VA_ARGS__包含了若干參數,我怎么才能知道里面參數有多少個呢?
比如寫一個宏NUM_PARAMS(),里面寫NUM_PARAMS(abc,a,d,e)的話,替換后得到的結果要是4,能辦到嗎?
 
 
 
 
 
 
 
 
 
 
廣告時間:
http://blog.misakamm.org/p/209
廣告過后,回來精彩的節目
 
 
 
 
 
 
 
 
 
 
首先先介紹gcc派的解決方案:
#define PP_NARG(...) PP_NARG_(__VA_ARGS__, PP_RSEQ_N())
#define PP_NARG_(...) PP_ARG_N(__VA_ARGS__)
#define PP_ARG_N( \
_1, _2, _3, _4, _5, _6, _7, _8, _9,_10, \
_11,_12,_13,_14,_15,_16, N, ...) N
#define PP_RSEQ_N() \
16,15,14,13,12,11,10, \
9,8,7,6,5,4,3,2,1,0
非常漂亮巧妙又簡潔的方案,我想不用我多解釋了吧?
不過,請注意,這是gcc的方案,以上代碼放在vc8/vc9/vc2010等都會得不到正確的結果的,這個和vc的宏處理方式有關
接下來就是給出vc的解決方案(以下均以vc2008和vc2010為準)
#define BRACKET_L() (
#define BRACKET_R() )
#define PP_NARG(...) \
PP_NARG_ ( __VA_ARGS__, PP_RSEQ_N() )
#define PP_NARG_(...) \
PP_ARG_N BRACKET_L() __VA_ARGS__ BRACKET_R()
#define PP_ARG_N( \
_1, _2, _3, _4, _5, _6, _7, _8, _9,_10, \
_11,_12,_13,_14,_15,_16, N,...) N
#define PP_RSEQ_N() \
16,15,14,13,12,11,10, \
9,8,7,6,5,4,3,2,1,0
這里很特別的一點是對部分小括號做了替換。
問題在于PP_NARG_到PP_ARG_N做參數傳遞的時候,如果已有顯式的括號,那么不對里面的宏做展開計算參數個數,僅直接按顯式的逗號個數判斷出參數個數,從而導致__VA_ARGS__被當成一個參數傳入。而把括號用宏替換掉后,則不出現直接的括號,就先對宏做展開,而展開后,再展開新構造出來的宏,這樣才能讓參數匹配上。
不過gcc里面不能這么干,gcc會把宏名展開出來后,如果發現后面的符號并不是顯式的括號,則把前面的宏符號化,不再展開。這兩種不同的特性讓我現在還不知道怎么編寫宏能讓兩派都能兼容,正確展開出我想要的東西。
解釋了兩個編譯器的不同點以后,后面不再解釋相同的問題,而會同時給出兩份代碼。
另一個類似的問題,就是既然有不定個數的參數,如果我希望對每個參數都做一些處理,那如何做呢?
舉例,實現一個宏#define SPREAD(...),要把參數里的東西連結成一個字符串
之前的例子里,已經實現了把不定參數展開的手段,現在我們來嘗試遞歸下降式展開(gcc版本):
#define SPREAD0( arg ) #arg
#define SPREAD1(arg, ...) SPREAD0(arg)
#define SPREAD2(arg, ...) SPREAD0(arg) SPREAD1(__VA_ARGS__,)
#define SPREAD3(arg, ...) SPREAD0(arg) SPREAD2(__VA_ARGS__,)
#define SPREAD4(arg, ...) SPREAD0(arg) SPREAD3(__VA_ARGS__,)
#define SPREAD5(arg, ...) SPREAD0(arg) SPREAD4(__VA_ARGS__,)
#define SPREAD6(arg, ...) SPREAD0(arg) SPREAD5(__VA_ARGS__,)
#define SPREAD7(arg, ...) SPREAD0(arg) SPREAD6(__VA_ARGS__,)
#define SPREAD8(arg, ...) SPREAD0(arg) SPREAD7(__VA_ARGS__,)
#define SPREAD9(arg, ...) SPREAD0(arg) SPREAD8(__VA_ARGS__,)
#define SPREAD(...) SPREAD9(__VA_ARGS__)
在這里,每進入一層,就從__VA_ARGS__拆解一個最前面的參數出來,把剩下的參數給下一層
這里有一個細節是__VA_ARGS__后面有一個逗號,意思就是補一個空參數,避免后面參數不足
然后就可以用puts(SPREAD(1, 2, 3, 4));來測試了
當然,還要使用前文的方式處理一下(gcc版):
#define SPREAD0( arg ) #arg
#define SPREAD1(n, arg, ...) SPREAD0(arg)
#define SPREAD2(n, arg, ...) SPREAD0(arg) MACROCAT(SPREAD, DECVAL(n)) ( DECVAL(n), __VA_ARGS__, )
#define SPREAD3(n, arg, ...) SPREAD0(arg) MACROCAT(SPREAD, DECVAL(n)) ( DECVAL(n), __VA_ARGS__, )
#define SPREAD4(n, arg, ...) SPREAD0(arg) MACROCAT(SPREAD, DECVAL(n)) ( DECVAL(n), __VA_ARGS__, )
#define SPREAD5(n, arg, ...) SPREAD0(arg) MACROCAT(SPREAD, DECVAL(n)) ( DECVAL(n), __VA_ARGS__, )
#define SPREAD6(n, arg, ...) SPREAD0(arg) MACROCAT(SPREAD, DECVAL(n)) ( DECVAL(n), __VA_ARGS__, )
#define SPREAD7(n, arg, ...) SPREAD0(arg) MACROCAT(SPREAD, DECVAL(n)) ( DECVAL(n), __VA_ARGS__, )
#define SPREAD8(n, arg, ...) SPREAD0(arg) MACROCAT(SPREAD, DECVAL(n)) ( DECVAL(n), __VA_ARGS__, )
#define SPREAD9(n, arg, ...) SPREAD0(arg) MACROCAT(SPREAD, DECVAL(n)) ( DECVAL(n), __VA_ARGS__, )
#define SPREAD(...) SPREAD9 ( 9, __VA_ARGS__ )
vc版:
#pragma warning(disable:4003) // 去除警告
#define SPREAD0( arg ) #arg
#define SPREAD1(n, arg, ...) SPREAD0(arg)
#define SPREAD2(n, arg, ...) SPREAD0(arg) MACROCAT(SPREAD, DECVAL(n)) BRACKET_L() DECVAL(n), __VA_ARGS__, BRACKET_R()
#define SPREAD3(n, arg, ...) SPREAD0(arg) MACROCAT(SPREAD, DECVAL(n)) BRACKET_L() DECVAL(n), __VA_ARGS__, BRACKET_R()
#define SPREAD4(n, arg, ...) SPREAD0(arg) MACROCAT(SPREAD, DECVAL(n)) BRACKET_L() DECVAL(n), __VA_ARGS__, BRACKET_R()
#define SPREAD5(n, arg, ...) SPREAD0(arg) MACROCAT(SPREAD, DECVAL(n)) BRACKET_L() DECVAL(n), __VA_ARGS__, BRACKET_R()
#define SPREAD6(n, arg, ...) SPREAD0(arg) MACROCAT(SPREAD, DECVAL(n)) BRACKET_L() DECVAL(n), __VA_ARGS__, BRACKET_R()
#define SPREAD7(n, arg, ...) SPREAD0(arg) MACROCAT(SPREAD, DECVAL(n)) BRACKET_L() DECVAL(n), __VA_ARGS__, BRACKET_R()
#define SPREAD8(n, arg, ...) SPREAD0(arg) MACROCAT(SPREAD, DECVAL(n)) BRACKET_L() DECVAL(n), __VA_ARGS__, BRACKET_R()
#define SPREAD9(n, arg, ...) SPREAD0(arg) MACROCAT(SPREAD, DECVAL(n)) BRACKET_L() DECVAL(n), __VA_ARGS__, BRACKET_R()
#define SPREAD(...) SPREAD9 BRACKET_L() 9, __VA_ARGS__, BRACKET_R()
以上只是模糊方式展開,因為參數個數不知道,后面會遇到宏參數為空的情況,于是vc編譯器給出了警告
如果把之前說的過技巧,就是分析出不定參數個數的宏,與這個結合,將產生更大的威力,我們可以實現精確展開,就是在SPREAD宏的定義里,有9的地方使用宏PP_NARG(__VA_ARGS__)替換一下,于是__VA_ARGS__后面的逗號可以去掉,也可以簡化一些代碼了,也能避免展開后有你所不希望的多余字符出現。
測試考題1:
定義一宏#define printf,讓它能把printf(str, a, b, c);替換成std::cout<<a<<b<<c<<std::endl;
參數個數不確定,不用考慮str的內容,但假設不多于10個參數

http://blog.misakamm.org/p/209
宏的威力還不止至此,當宏與C++模板編程結合的時候,真正的可怕就來臨了。。。
測試考題2:
在C++0x之前,模板還沒有不定參數,于是需要多個參數的時候,不得不手工解決,或者聰明的人,使用模板來生成多參模板代碼。嘗試一下這么做,看看和之前的問題難度加大在哪里。比如生成一個名為sum的模板函數,能接受1 - 10個參數,返回這些參數的相加的結果

 
 
 
 
 
 
 
 
 
 
 
文章附帶:
第一考題參考答案:
#define BINARY_E0(n, arg) TOSTRING ( arg )
#define BINARY_E1(n, arg) MACROCAT(BINARY_E, DECVAL(n)) ( DECVAL(n), MACROCAT(arg, 0) )\
"," MACROCAT(BINARY_E, DECVAL(n)) ( DECVAL(n), MACROCAT(arg, 1) )
#define BINARY_E2(n, arg) MACROCAT(BINARY_E, DECVAL(n)) ( DECVAL(n), MACROCAT(arg, 0) )\
"," MACROCAT(BINARY_E, DECVAL(n)) ( DECVAL(n), MACROCAT(arg, 1) )
#define BINARY_E3(n, arg) MACROCAT(BINARY_E, DECVAL(n)) ( DECVAL(n), MACROCAT(arg, 0) )\
"," MACROCAT(BINARY_E, DECVAL(n)) ( DECVAL(n), MACROCAT(arg, 1) )
#define BINARY_E4(n, arg) MACROCAT(BINARY_E, DECVAL(n)) ( DECVAL(n), MACROCAT(arg, 0) )\
"," MACROCAT(BINARY_E, DECVAL(n)) ( DECVAL(n), MACROCAT(arg, 1) )
#define BINARY_E5(n, arg) MACROCAT(BINARY_E, DECVAL(n)) ( DECVAL(n), MACROCAT(arg, 0) )\
"," MACROCAT(BINARY_E, DECVAL(n)) ( DECVAL(n), MACROCAT(arg, 1) )
#define BINARY_E6(n, arg) MACROCAT(BINARY_E, DECVAL(n)) ( DECVAL(n), MACROCAT(arg, 0) )\
"," MACROCAT(BINARY_E, DECVAL(n)) ( DECVAL(n), MACROCAT(arg, 1) )
#define BINARY_E7(n, arg) MACROCAT(BINARY_E, DECVAL(n)) ( DECVAL(n), MACROCAT(arg, 0) )\
"," MACROCAT(BINARY_E, DECVAL(n)) ( DECVAL(n), MACROCAT(arg, 1) )
#define BINARY_E8(n, arg) MACROCAT(BINARY_E, DECVAL(n)) ( DECVAL(n), MACROCAT(arg, 0) )\
"," MACROCAT(BINARY_E, DECVAL(n)) ( DECVAL(n), MACROCAT(arg, 1) )
#define BINARY_ENUM(n) MACROCAT(BINARY_E, n) ( n, )
#define BIN_0(n, arg) TOSTRING ( arg )
#define BIN_1(n, arg) MACROCAT(BIN_, DECVAL(n)) (DECVAL(n), arg) \
"," MACROCAT(BINARY_E, DECVAL(n)) (DECVAL(n), MACROCAT(arg, 1))
#define BIN_2(n, arg) MACROCAT(BIN_, DECVAL(n)) (DECVAL(n), arg) \
"," MACROCAT(BINARY_E, DECVAL(n)) (DECVAL(n), MACROCAT(arg, 1))
#define BIN_3(n, arg) MACROCAT(BIN_, DECVAL(n)) (DECVAL(n), arg) \
"," MACROCAT(BINARY_E, DECVAL(n)) (DECVAL(n), MACROCAT(arg, 1))
#define BIN_4(n, arg) MACROCAT(BIN_, DECVAL(n)) (DECVAL(n), arg) \
"," MACROCAT(BINARY_E, DECVAL(n)) (DECVAL(n), MACROCAT(arg, 1))
#define BIN_5(n, arg) MACROCAT(BIN_, DECVAL(n)) (DECVAL(n), arg) \
"," MACROCAT(BINARY_E, DECVAL(n)) (DECVAL(n), MACROCAT(arg, 1))
#define BIN_6(n, arg) MACROCAT(BIN_, DECVAL(n)) (DECVAL(n), arg) \
"," MACROCAT(BINARY_E, DECVAL(n)) (DECVAL(n), MACROCAT(arg, 1))
#define BIN_7(n, arg) MACROCAT(BIN_, DECVAL(n)) (DECVAL(n), arg) \
"," MACROCAT(BINARY_E, DECVAL(n)) (DECVAL(n), MACROCAT(arg, 1))
#define BIN_8(n, arg) MACROCAT(BIN_, DECVAL(n)) (DECVAL(n), arg) \
"," MACROCAT(BINARY_E, DECVAL(n)) (DECVAL(n), MACROCAT(arg, 1))
#define BIN_ENUM(n) "0" MACROCAT(BIN_, n) ( n, )
測試代碼:puts(BIN_ENUM(8));
測試考題不提供答案。

posted on 2012-01-16 16:22 御坂美琴 閱讀(7228) 評論(0)  編輯 收藏 引用

青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <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>
            一区二区三区成人精品| 激情欧美日韩| 久久久精品五月天| 国产一区二区三区无遮挡| 美女日韩在线中文字幕| 亚洲欧美日韩精品在线| 亚洲国产精品成人精品| 亚洲深夜福利视频| 亚洲精品在线电影| 日韩一级视频免费观看在线| 欧美午夜一区二区福利视频| 欧美亚洲视频在线观看| 一本色道综合亚洲| 亚洲一区二区在线免费观看| 欧美激情视频在线播放| 免费亚洲视频| 亚洲国产欧美不卡在线观看| 亚洲成人在线免费| 一本久久a久久免费精品不卡 | 国产精品成人免费视频| 久久综合九色综合欧美就去吻| 亚洲无玛一区| 久久精品2019中文字幕| 欧美福利一区| 欧美体内she精视频在线观看| 欧美日韩一区二区视频在线| 欧美午夜电影在线观看| 欧美午夜精品理论片a级按摩| 国产精品麻豆欧美日韩ww| 国产精品毛片高清在线完整版| 国产一区二区福利| 亚洲激情不卡| 久久国产99| 99国产欧美久久久精品| 久久综合久久美利坚合众国| 欧美激情一区二区三区在线| 欧美日韩第一区| 国产精品丝袜91| 最新中文字幕一区二区三区| 午夜精品在线观看| 99这里只有久久精品视频| 免费在线亚洲欧美| 在线播放不卡| 欧美成在线视频| 欧美主播一区二区三区| 国产亚洲激情视频在线| 亚洲视频中文| 午夜欧美视频| 国产综合精品一区| 国产精品一区久久久| 一区二区三区精品国产| 欧美成人在线免费观看| 久久中文精品| 国内精品福利| 亚洲电影在线看| 欧美aⅴ一区二区三区视频| 在线不卡免费欧美| 免费视频最近日韩| 免费观看在线综合| 在线视频亚洲| 一本不卡影院| 欧美在线视频不卡| 久久er精品视频| 亚洲高清成人| 一本色道久久综合精品竹菊| 国产精品草莓在线免费观看| 一区二区三区欧美视频| 亚洲综合电影| 亚洲国产精品激情在线观看| 久久综合狠狠综合久久综青草| 久久久久久香蕉网| 亚洲午夜久久久久久尤物| 亚洲欧美日韩电影| 亚洲电影激情视频网站| 亚洲精品日韩在线观看| 国产午夜精品久久久久久免费视| 欧美bbbxxxxx| 黑丝一区二区| 欧美有码在线视频| 亚洲图片欧美一区| 欧美日韩成人综合天天影院| 久久xxxx| 国产亚洲美州欧州综合国| 日韩一级黄色片| 亚洲精选一区二区| 亚洲片区在线| 欧美激情综合| 亚洲欧洲一区二区三区| 亚洲第一在线| 久久久久久久精| 久久久久久久网站| 国产精品一二三四| 亚洲天堂av图片| 亚洲天堂免费在线观看视频| 欧美电影在线观看| 一本色道**综合亚洲精品蜜桃冫| 怡红院精品视频| 欧美91视频| 一区二区三区蜜桃网| 欧美与欧洲交xxxx免费观看| 揄拍成人国产精品视频| 欧美成人精品一区二区三区| 欧美freesex8一10精品| 亚洲人屁股眼子交8| 欧美激情视频一区二区三区在线播放 | 久久五月天婷婷| 亚洲日本一区二区三区| 欧美日韩ab片| 午夜精品久久久久久久男人的天堂| 久久精品国产亚洲a| 91久久国产综合久久91精品网站| 国产精品久久久久一区| 美女爽到呻吟久久久久| 亚洲一区在线免费观看| 久久综合中文字幕| 午夜精品剧场| 在线一区二区三区四区五区| 亚洲电影免费观看高清完整版在线观看| 欧美大片免费久久精品三p | 亚洲欧美怡红院| 欧美国产视频在线| 久久久亚洲高清| 亚洲欧美日韩直播| 亚洲一区在线直播| 亚洲小视频在线观看| 99re热精品| 亚洲欧洲精品成人久久奇米网| 国产日韩精品一区二区浪潮av| 欧美激情成人在线| 欧美精品成人| 欧美三级第一页| 国产精品欧美一区二区三区奶水 | 亚洲精选视频免费看| 亚洲日本中文字幕| 亚洲第一综合天堂另类专| 欧美国产先锋| 亚洲欧美另类综合偷拍| 久久男人av资源网站| 欧美极品aⅴ影院| 国产伦精品一区二区三| 尤物九九久久国产精品的分类| 亚洲电影免费在线观看| 欧美在线综合视频| 欧美成人情趣视频| 中国av一区| 欧美日韩日韩| 一区二区三区免费网站| 99国产麻豆精品| 久久久国产精品一区二区中文| 欧美国产一区二区| 国产日韩在线一区| 一本久久综合亚洲鲁鲁| 欧美高清视频在线| 午夜欧美大片免费观看| 欧美成人精品h版在线观看| 国产日韩欧美成人| 欧美成人第一页| 国产精品美女一区二区在线观看| 91久久精品美女高潮| 久久蜜桃资源一区二区老牛 | 91久久精品国产91久久性色| 午夜精品美女久久久久av福利| 欧美亚洲第一页| 日韩一级精品| 亚洲人成亚洲人成在线观看| 久久国产成人| 在线精品亚洲| 欧美综合国产精品久久丁香| 99视频超级精品| 欧美揉bbbbb揉bbbbb| 久久久女女女女999久久| 欧美亚洲在线播放| 在线观看国产精品淫| 欧美国产第二页| 欧美日韩在线精品| 亚洲男人第一网站| 亚洲综合另类| 91久久精品日日躁夜夜躁欧美| 亚洲乱码国产乱码精品精98午夜| 欧美三级网页| 麻豆精品传媒视频| 欧美黑人在线观看| 亚洲午夜精品网| 久久久久久久久一区二区| 亚洲精品一区在线| 欧美一区二区三区在线视频| 日韩亚洲欧美精品| 欧美影院久久久| 亚洲一区二区三区在线| 亚洲精品在线观看免费| 激情久久久久久久| 亚洲午夜一区二区三区| 亚洲精品久久久久久久久久久久久 | 欧美一区二区三区四区在线观看地址 | 亚洲国产精品成人| 国产麻豆日韩欧美久久| 日韩午夜在线| 亚洲国产精品成人综合| 久久婷婷综合激情| 鲁大师影院一区二区三区|