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

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

圖形與游戲編程

常用鏈接

統(tǒng)計(jì)

積分與排名

Blog

最新評(píng)論

C/C++宏的奇技淫巧

來源:http://blog.misakamm.org/p/209
宏的主要作用就是簡化代碼編寫,簡化一些需要重復(fù)編碼的地方,以得到看起來更優(yōu)雅的代碼。但宏要用得好并不容易,用的不好很容易引發(fā)災(zāi)難性的后果。本文會(huì)介紹宏比較偏門但又很實(shí)用的技巧。
首先就是最常用的技巧(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展開后連結(jié),而TOSTRING把s轉(zhuǎn)化為字符串,比如可以printf(TOSTRING(%s), TOSTRING(abcdefg));
然后,因?yàn)楹瓴荒苓f歸,但可以做遞歸模擬,我們可以這樣玩。比如要生成n位的二進(jìn)制數(shù)并且從小到大構(gòu)成的字符串(用到前面的宏):
#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(),實(shí)際上展開的結(jié)果是
"0" "0" "," "0" "1" "," "1" "0" "," "1" "1"
不過c/c++規(guī)定這樣連寫的字符串,編譯時(shí)就會(huì)合并成一個(gè),于是就能用puts直接完整輸出結(jié)果了
如果你想得到更多的位,很簡單,只要你不介意,上面的宏復(fù)制并改改數(shù)字就可以了
不過,這樣一改要改若干個(gè)數(shù)字,比較麻煩,能不能讓它工作得更好?比如只要改宏名?
這個(gè)時(shí)候,就要用更富有技巧性的一招了:讓每個(gè)宏多一個(gè)參數(shù)n,然后前面的BIN_x使用MACROCAT把它與數(shù)字連結(jié)起來,不就可以了么?
想法不錯(cuò),不過問題是宏本身沒有做減法的能力,能做的僅僅是替換。減1應(yīng)該怎么實(shí)現(xiàn)呢?
其實(shí)不難,見以下定義:
#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
好了,有了這個(gè)利器,我們就可以對(duì)原宏改造了,先拿0號(hào)和1號(hào)宏開刀:
#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號(hào),只要復(fù)制一下1號(hào)的定義,改一改宏名就解決問題了
思考題:
這里生成的二進(jìn)制結(jié)果是帶前導(dǎo)0的,如何改寫能使生成的結(jié)果不帶前導(dǎo)0?
source: http://blog.misakamm.org/p/209

使用此法可以“遞歸”式生成很多類似代碼,同時(shí)這個(gè)技巧也非常的實(shí)用,但遞歸構(gòu)造并不容易,需要編寫的人仔細(xì)想清楚,否則很容易出錯(cuò),特別要注意宏展開的時(shí)機(jī),一般不直接使用MACROCAT1宏,因?yàn)槟莻€(gè)很可能不是你想要的結(jié)果
之后,到C99標(biāo)準(zhǔn)出臺(tái)后(也就是說,下文內(nèi)容與bc3/tc/vc6不兼容),宏里面多了一個(gè)狠角色:可變參數(shù)個(gè)數(shù)宏
比如可以 #define PRINTF(...) fprintf(stdout, __VA_ARGS__)
其中__VA_ARGS__代表了‘...’部分的全部參數(shù),這樣可以輕松的重定義庫函數(shù)里不定參數(shù)的函數(shù)的輸出行為,比如printf重定向到文件(雖然也可以用freopen實(shí)現(xiàn),但只想說明宏也可以這樣搞)
好了,下文將區(qū)分編譯器來介紹,一共分為兩派,vc派和gcc派(包括clang/objc),因?yàn)閮烧邔?duì)以下代碼的處理并不一致,需要使用略為不同的宏來實(shí)現(xiàn),目前我也只遇到這兩派。
現(xiàn)在的目的是這樣,因?yàn)開_VA_ARGS__包含了若干參數(shù),我怎么才能知道里面參數(shù)有多少個(gè)呢?
比如寫一個(gè)宏NUM_PARAMS(),里面寫NUM_PARAMS(abc,a,d,e)的話,替換后得到的結(jié)果要是4,能辦到嗎?
 
 
 
 
 
 
 
 
 
 
廣告時(shí)間:
http://blog.misakamm.org/p/209
廣告過后,回來精彩的節(jié)目
 
 
 
 
 
 
 
 
 
 
首先先介紹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
非常漂亮巧妙又簡潔的方案,我想不用我多解釋了吧?
不過,請(qǐng)注意,這是gcc的方案,以上代碼放在vc8/vc9/vc2010等都會(huì)得不到正確的結(jié)果的,這個(gè)和vc的宏處理方式有關(guān)
接下來就是給出vc的解決方案(以下均以vc2008和vc2010為準(zhǔn))
#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
這里很特別的一點(diǎn)是對(duì)部分小括號(hào)做了替換。
問題在于PP_NARG_到PP_ARG_N做參數(shù)傳遞的時(shí)候,如果已有顯式的括號(hào),那么不對(duì)里面的宏做展開計(jì)算參數(shù)個(gè)數(shù),僅直接按顯式的逗號(hào)個(gè)數(shù)判斷出參數(shù)個(gè)數(shù),從而導(dǎo)致__VA_ARGS__被當(dāng)成一個(gè)參數(shù)傳入。而把括號(hào)用宏替換掉后,則不出現(xiàn)直接的括號(hào),就先對(duì)宏做展開,而展開后,再展開新構(gòu)造出來的宏,這樣才能讓參數(shù)匹配上。
不過gcc里面不能這么干,gcc會(huì)把宏名展開出來后,如果發(fā)現(xiàn)后面的符號(hào)并不是顯式的括號(hào),則把前面的宏符號(hào)化,不再展開。這兩種不同的特性讓我現(xiàn)在還不知道怎么編寫宏能讓兩派都能兼容,正確展開出我想要的東西。
解釋了兩個(gè)編譯器的不同點(diǎn)以后,后面不再解釋相同的問題,而會(huì)同時(shí)給出兩份代碼。
另一個(gè)類似的問題,就是既然有不定個(gè)數(shù)的參數(shù),如果我希望對(duì)每個(gè)參數(shù)都做一些處理,那如何做呢?
舉例,實(shí)現(xiàn)一個(gè)宏#define SPREAD(...),要把參數(shù)里的東西連結(jié)成一個(gè)字符串
之前的例子里,已經(jīng)實(shí)現(xiàn)了把不定參數(shù)展開的手段,現(xiàn)在我們來嘗試遞歸下降式展開(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__)
在這里,每進(jìn)入一層,就從__VA_ARGS__拆解一個(gè)最前面的參數(shù)出來,把剩下的參數(shù)給下一層
這里有一個(gè)細(xì)節(jié)是__VA_ARGS__后面有一個(gè)逗號(hào),意思就是補(bǔ)一個(gè)空參數(shù),避免后面參數(shù)不足
然后就可以用puts(SPREAD(1, 2, 3, 4));來測(cè)試了
當(dāng)然,還要使用前文的方式處理一下(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()
以上只是模糊方式展開,因?yàn)閰?shù)個(gè)數(shù)不知道,后面會(huì)遇到宏參數(shù)為空的情況,于是vc編譯器給出了警告
如果把之前說的過技巧,就是分析出不定參數(shù)個(gè)數(shù)的宏,與這個(gè)結(jié)合,將產(chǎn)生更大的威力,我們可以實(shí)現(xiàn)精確展開,就是在SPREAD宏的定義里,有9的地方使用宏P(guān)P_NARG(__VA_ARGS__)替換一下,于是__VA_ARGS__后面的逗號(hào)可以去掉,也可以簡化一些代碼了,也能避免展開后有你所不希望的多余字符出現(xiàn)。
測(cè)試考題1:
定義一宏#define printf,讓它能把printf(str, a, b, c);替換成std::cout<<a<<b<<c<<std::endl;
參數(shù)個(gè)數(shù)不確定,不用考慮str的內(nèi)容,但假設(shè)不多于10個(gè)參數(shù)

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

 
 
 
 
 
 
 
 
 
 
 
文章附帶:
第一考題參考答案:
#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, )
測(cè)試代碼:puts(BIN_ENUM(8));
測(cè)試考題不提供答案。

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


只有注冊(cè)用戶登錄后才能發(fā)表評(píng)論。
網(wǎng)站導(dǎo)航: 博客園   IT新聞   BlogJava   博問   Chat2DB   管理


青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <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>
            欧美日韩一区二区在线播放| 亚洲精品乱码| 亚洲区免费影片| 国内精品视频在线播放| 国内精品久久久久久影视8| 国产亚洲精品激情久久| 国产一区二区三区在线观看精品| 国产一区二区三区最好精华液| 国内揄拍国内精品久久| 亚洲日本欧美日韩高观看| 99视频有精品| 麻豆精品视频在线观看| 牛牛国产精品| 国产精品热久久久久夜色精品三区| 国产日韩一区在线| 亚洲区一区二区三区| 亚洲午夜电影| 免费高清在线视频一区·| 欧美激情视频免费观看| 亚洲一区二区黄| 久久偷看各类wc女厕嘘嘘偷窃| 欧美日韩p片| 韩国精品主播一区二区在线观看| 亚洲精品黄网在线观看| 午夜欧美大片免费观看| 欧美二区不卡| 亚洲欧美日韩国产综合精品二区| 久久婷婷成人综合色| 国产精品大全| 亚洲精品国精品久久99热| 久久久精品999| 一本色道久久综合| 欧美激情亚洲自拍| 影音先锋中文字幕一区| 性刺激综合网| 一本色道久久综合亚洲精品不卡| 免费一级欧美片在线播放| 国产日韩欧美精品在线| 亚洲午夜av在线| 亚洲欧洲日本在线| 久久久久在线| 国产专区欧美精品| 欧美影院久久久| 亚洲少妇诱惑| 欧美亚韩一区| 亚洲欧美成人网| 99热这里只有成人精品国产| 免费观看亚洲视频大全| 在线观看日产精品| 久久在线视频在线| 欧美在线视频免费| 国产精品久久国产愉拍| 在线中文字幕日韩| 亚洲激情电影中文字幕| 免费在线看一区| 亚洲国产日本| 欧美国产日产韩国视频| 久久在线91| 1000部国产精品成人观看| 久久综合色综合88| 久久青草久久| 亚洲国产经典视频| 亚洲丰满少妇videoshd| 欧美电影电视剧在线观看| 亚洲日本aⅴ片在线观看香蕉| 嫩草国产精品入口| 免费亚洲网站| 亚洲最新视频在线播放| 妖精视频成人观看www| 国产精品高潮呻吟久久av黑人| 亚洲免费一区二区| 欧美在线免费| 最新国产成人在线观看 | 久久视频一区| 亚洲永久免费精品| 国产一区二区精品久久| 猛干欧美女孩| 欧美极品aⅴ影院| 亚洲欧美三级伦理| 欧美一区二视频| 在线免费观看欧美| 亚洲精品社区| 国产片一区二区| 欧美高清在线观看| 欧美日韩亚洲一区在线观看| 亚洲一区二区动漫| 欧美在线观看一区二区| 亚洲高清资源| 在线综合亚洲欧美在线视频| 韩国v欧美v日本v亚洲v | 快播亚洲色图| 999亚洲国产精| 亚洲欧美一区二区三区在线| 在线观看三级视频欧美| 99视频超级精品| 国产一区二区三区丝袜| 亚洲激情欧美激情| 国产午夜精品视频| 亚洲精品久久久久| 国模私拍一区二区三区| 一区二区av| 亚洲国产精品成人va在线观看| 一区二区欧美在线观看| 亚洲国产精品成人精品| 亚洲女人天堂av| 一级成人国产| 久久久夜精品| 欧美一区二区精美| 欧美日韩国产综合网| 欧美91大片| 国产日韩精品久久久| 9l国产精品久久久久麻豆| 亚洲成色精品| 久久福利电影| 欧美一区三区二区在线观看| 欧美日本不卡高清| 欧美二区在线看| 黄色av日韩| 欧美一二三区精品| 亚洲综合大片69999| 欧美激情中文字幕在线| 男女视频一区二区| 国模精品娜娜一二三区| 午夜精品视频一区| 亚洲欧美日韩国产另类专区| 欧美屁股在线| 亚洲黄页视频免费观看| 亚洲精品偷拍| 蜜臀av性久久久久蜜臀aⅴ| 麻豆九一精品爱看视频在线观看免费 | 乱中年女人伦av一区二区| 国产精品日韩在线播放| 一本色道久久综合一区| 一区二区冒白浆视频| 欧美日韩a区| 99在线热播精品免费99热| 99精品久久久| 欧美日韩在线一区| 一区二区三区黄色| 亚洲一区视频| 国产嫩草一区二区三区在线观看 | 欧美亚洲综合网| 国产精品色一区二区三区| 亚洲精品日韩在线| 中文欧美在线视频| 欧美视频在线一区| 亚洲一区二区三区视频| 久久精品国产欧美亚洲人人爽| 国产婷婷色一区二区三区四区| 欧美亚洲一级| 另类春色校园亚洲| 亚洲精品影视在线观看| 欧美日本精品| 亚洲一区二区三区在线观看视频| 午夜精品福利视频| 国内成+人亚洲| 免费观看成人网| aa级大片欧美三级| 久久成人精品视频| 亚洲国产精品一区二区www| 欧美激情中文不卡| 亚洲性人人天天夜夜摸| 久久夜色精品亚洲噜噜国产mv| 在线观看久久av| 欧美日韩久久| 久久国产精品久久久| 亚洲人成在线播放| 欧美伊人精品成人久久综合97| 影音国产精品| 国产精品福利在线| 久久久水蜜桃| 亚洲一区二区三区免费在线观看 | 亚洲综合日韩| 亚洲第一黄色| 午夜在线a亚洲v天堂网2018| 伊人久久成人| 国产精品久久久久久久久果冻传媒| 欧美在现视频| 亚洲狼人综合| 免费永久网站黄欧美| 亚洲欧美一区在线| 亚洲精品系列| 激情欧美亚洲| 国产美女一区二区| 欧美日韩午夜精品| 美女亚洲精品| 欧美在线一级va免费观看| 亚洲久久成人| 欧美激情免费在线| 美女91精品| 久久成人精品无人区| 中文日韩欧美| 亚洲欧洲综合另类在线| 激情文学综合丁香| 国产视频不卡| 国产精品日本| 国产精品另类一区| 欧美午夜电影在线观看| 欧美国产精品| 女仆av观看一区|