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

Prayer

在一般中尋求卓越
posts - 1256, comments - 190, trackbacks - 0, articles - 0
  C++博客 :: 首頁 :: 新隨筆 :: 聯(lián)系 :: 聚合  :: 管理

玩轉(zhuǎn)setjmp與longjmp

Posted on 2009-05-19 11:30 Prayer 閱讀(312) 評論(0)  編輯 收藏 引用 所屬分類: C/C++LINUX/UNIX/AIX
不要忘記,前面我們得出過結(jié)論,C語言中提供的這種異常處理機(jī)制,與C++中的異常處理模型很相似。例如,可以定義出類似的try block(受到監(jiān)控的代碼);catch block(異常錯(cuò)誤的處理模塊);以及可以隨時(shí)拋出的異常(throw語句)。所以說,我們可以通過一種非常有技巧的封裝,來達(dá)到對setjmp和longjmp的使用方法(或者說語法規(guī)則),基本與C++中的語法一致。很有誘惑吧!

首先展示阿愚封裝的在C語言環(huán)境中異常處理框架

  1、首先是接口的頭文件,主要采用“宏”技術(shù)!代碼如下:

/*************************************************
* author: 王勝祥 *
* email: <mantx@21cn.com> *
* date: 2005-03-07 *
* version: *
* filename: ceh.h *
*************************************************/


/********************************************************************

This file is part of CEH(Exception Handling in C Language).

CEH is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2 of the License, or
(at your option) any later version.

CEH is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.

  注意:這個(gè)異常處理框架不支持線程安全,不能在多線程的程序環(huán)境下使用。
如果您想在多線程的程序中使用它,您可以自己試著來繼續(xù)完善這個(gè)
框架模型。
*********************************************************************/

#include <stdio.h>
#include <signal.h>
#include <setjmp.h>
#include <stdlib.h>
#include <float.h>
#include <math.h>
#include <string.h>


////////////////////////////////////////////////////
/* 與異常有關(guān)的結(jié)構(gòu)體定義 */
typedef struct _CEH_EXCEPTION {
int err_type; /* 異常類型 */
int err_code; /* 錯(cuò)誤代碼 */
char err_msg[80]; /* 錯(cuò)誤信息 */
}CEH_EXCEPTION; /* 異常對象 */

typedef struct _CEH_ELEMENT {
jmp_buf exec_status;
CEH_EXCEPTION ex_info;

struct _CEH_ELEMENT* next;
} CEH_ELEMENT; /* 存儲異常對象的鏈表元素 */
////////////////////////////////////////////////////


////////////////////////////////////////////////////
/* 內(nèi)部接口定義,操縱維護(hù)鏈表數(shù)據(jù)結(jié)構(gòu) */
extern void CEH_push(CEH_ELEMENT* ceh_element);
extern CEH_ELEMENT* CEH_pop();
extern CEH_ELEMENT* CEH_top();
extern int CEH_isEmpty();
////////////////////////////////////////////////////


/* 以下是外部接口的定義 */
////////////////////////////////////////////////////
/* 拋出異常 */
extern void thrower(CEH_EXCEPTION* e);

/* 拋出異常 (throw)
a表示err_type
b表示err_code
c表示err_msg
*/
#define throw(a, b, c)
{
CEH_EXCEPTION ex;
memset(&ex, 0, sizeof(ex));
ex.err_type = a;
ex.err_code = b;
strncpy(ex.err_msg, c, sizeof(c));
thrower(&ex);
}

/* 重新拋出原來的異常 (rethrow)*/
#define rethrow thrower(ceh_ex_info)
////////////////////////////////////////////////////


////////////////////////////////////////////////////
/* 定義try block(受到監(jiān)控的代碼)*/
#define try
{
int ___ceh_b_catch_found, ___ceh_b_occur_exception;
CEH_ELEMENT ___ceh_element;
CEH_EXCEPTION* ceh_ex_info;
memset(&___ceh_element, 0, sizeof(___ceh_element));
CEH_push(&___ceh_element);
ceh_ex_info = &___ceh_element.ex_info;
___ceh_b_catch_found = 0;
if (!(___ceh_b_occur_exception=setjmp(___ceh_element.exec_status)))
{


/* 定義catch block(異常錯(cuò)誤的處理模塊)
catch表示捕獲所有類型的異常
*/
#define catch
}
else
{
CEH_pop();
___ceh_b_catch_found = 1;


/* end_try表示前面定義的try block和catch block結(jié)束 */
#define end_try
}
{
/* 沒有執(zhí)行到任何的catch塊中 */
if(!___ceh_b_catch_found)
{
CEH_pop();
/* 出現(xiàn)了異常,但沒有捕獲到任何異常 */
if(___ceh_b_occur_exception) thrower(ceh_ex_info);
}
}
}


/* 定義catch block(異常錯(cuò)誤的處理模塊)
catch_part表示捕獲一定范圍內(nèi)的異常
*/
#define catch_part(i, j)
}
else if(ceh_ex_info->err_type>=i && ceh_ex_info->err_type<=j)
{
CEH_pop();
___ceh_b_catch_found = 1;


/* 定義catch block(異常錯(cuò)誤的處理模塊)
catch_one表示只捕獲一種類型的異常
*/
#define catch_one(i)
}
else if(ceh_ex_info->err_type==i)
{
CEH_pop();
___ceh_b_catch_found = 1;
////////////////////////////////////////////////////


////////////////////////////////////////////////////
/* 其它可選的接口定義 */
extern void CEH_init();
////////////////////////////////////////////////////


2、另外還有一個(gè)簡單的實(shí)現(xiàn)文件,主要實(shí)現(xiàn)功能封裝。代碼如下:

/*************************************************
* author: 王勝祥 *
* email: <mantx@21cn.com> *
* date: 2005-03-07 *
* version: *
* filename: ceh.c *
*************************************************/


/********************************************************************

This file is part of CEH(Exception Handling in C Language).

CEH is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2 of the License, or
(at your option) any later version.

CEH is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.

注意:這個(gè)異常處理框架不支持線程安全,不能在多線程的程序環(huán)境下使用。
如果您想在多線程的程序中使用它,您可以自己試著來繼續(xù)完善這個(gè)
框架模型。
*********************************************************************/

#include "ceh.h"

////////////////////////////////////////////////////
static CEH_ELEMENT* head = 0;

/* 把一個(gè)異常插入到鏈表頭中 */
void CEH_push(CEH_ELEMENT* ceh_element)
{
if(head) ceh_element->next = head;
head = ceh_element;
}


/* 從鏈表頭中,刪除并返回一個(gè)異常 */
CEH_ELEMENT* CEH_pop()
{
CEH_ELEMENT* ret = 0;

ret = head;
head = head->next;

return ret;
}


/* 從鏈表頭中,返回一個(gè)異常 */
CEH_ELEMENT* CEH_top()
{
return head;
}


/* 鏈表中是否有任何異常 */
int CEH_isEmpty()
{
return head==0;
}
////////////////////////////////////////////////////


////////////////////////////////////////////////////
/* 缺省的異常處理模塊 */
static void CEH_uncaught_exception_handler(CEH_EXCEPTION *ceh_ex_info)
{
printf("捕獲到一個(gè)未處理的異常,錯(cuò)誤原因是:%s! err_type:%d err_code:%d ",
ceh_ex_info->err_msg, ceh_ex_info->err_type, ceh_ex_info->err_code);
fprintf(stderr, "程序終止! ");
fflush(stderr);
exit(EXIT_FAILURE);
}
////////////////////////////////////////////////////


////////////////////////////////////////////////////
/* 拋出異常 */
void thrower(CEH_EXCEPTION* e)
{
CEH_ELEMENT *se;

if (CEH_isEmpty()) CEH_uncaught_exception_handler(e);

se = CEH_top();
se->ex_info.err_type = e->err_type;
se->ex_info.err_code = e->err_code;
strncpy(se->ex_info.err_msg, e->err_msg, sizeof(se->ex_info.err_msg));

longjmp(se->exec_status, 1);
}
////////////////////////////////////////////////////


////////////////////////////////////////////////////
static void fphandler( int sig, int num )
{
_fpreset();

switch( num )
{
case _FPE_INVALID:
throw(-1, num, "Invalid number" );
case _FPE_OVERFLOW:
throw(-1, num, "Overflow" );
case _FPE_UNDERFLOW:
throw(-1, num, "Underflow" );
case _FPE_ZERODIVIDE:
throw(-1, num, "Divide by zero" );
default:
throw(-1, num, "Other floating point error" );
}
}

void CEH_init()
{
_control87( 0, _MCW_EM );

if( signal( SIGFPE, fphandler ) == SIG_ERR )
{
fprintf( stderr, "Couldn't set SIGFPE " );
abort();
}
}
////////////////////////////////////////////////////
  體驗(yàn)上面設(shè)計(jì)出的異常處理框架
請花點(diǎn)時(shí)間仔細(xì)揣摩一下上面設(shè)計(jì)出的異常處理框架。呵呵!程序員朋友們,大家是不是發(fā)現(xiàn)它與C++提供的異常處理模型非常相似。例如,它提供的基本接口有 try、catch、以及throw等三條語句。還是先看個(gè)具體例子吧!以便驗(yàn)證一下這個(gè)C語言環(huán)境中異常處理框架是否真的比較好用。代碼如下:

#include "ceh.h"

int main(void)
{
//定義try block塊
try
{
int i,j;
printf("異常出現(xiàn)前 ");

// 拋出一個(gè)異常
// 其中第一個(gè)參數(shù),表示異常類型;第二個(gè)參數(shù)表示錯(cuò)誤代碼
// 第三個(gè)參數(shù)表示錯(cuò)誤信息
throw(9, 15, "出現(xiàn)某某異常");

printf("異常出現(xiàn)后 ");
}
//定義catch block塊
catch
{
printf("catch塊,被執(zhí)行到 ");
printf("捕獲到一個(gè)異常,錯(cuò)誤原因是:%s! err_type:%d err_code:%d ",
ceh_ex_info->err_msg, ceh_ex_info->err_type, ceh_ex_info->err_code);
}
// 這里稍有不同,需要定義一個(gè)表示當(dāng)前的try block結(jié)束語句
// 它主要是清除相應(yīng)的資源
end_try
}

  注意,上面的測試程序可是C語言環(huán)境下的程序(文件的擴(kuò)展名請使用.c結(jié)尾),雖然它看上去很像C++程序。請編譯運(yùn)行一下,發(fā)現(xiàn)它是不是運(yùn)行結(jié)果如下:
異常出現(xiàn)前

catch塊,被執(zhí)行到

  捕獲到一個(gè)異常,錯(cuò)誤原因是:出現(xiàn)某某異常! err_type:9 err_code:15

  呵呵!程序的確是在按照我們預(yù)想的流程在執(zhí)行。再次提醒,這可是C程序,但是它的異常處理卻非常類似于C++中的風(fēng)格,要知道,做到這一點(diǎn)其實(shí)非常地不容易。當(dāng)然,上面異常對象的傳遞只是在一個(gè)函數(shù)的內(nèi)部,同樣,它也適用于多個(gè)嵌套函數(shù)間的異常傳遞,還是用代碼驗(yàn)證一下吧!在上面的代碼基礎(chǔ)下,小小修改一點(diǎn),代碼如下:

#include "ceh.h"

void test1()
{
throw(0, 20, "hahaha");
}

void test()
{
test1();
}

int main(void)
{
try
{
int i,j;
printf("異常出現(xiàn)前 ");

// 注意,這個(gè)函數(shù)的內(nèi)部會拋出一個(gè)異常。
test();

throw(9, 15, "出現(xiàn)某某異常");

printf("異常出現(xiàn)后 ");
}
catch
{
printf("catch塊,被執(zhí)行到 ");
printf("捕獲到一個(gè)異常,錯(cuò)誤原因是:%s! err_type:%d err_code:%d ",
ceh_ex_info->err_msg, ceh_ex_info->err_type, ceh_ex_info->err_code);
}
end_try
}

  同樣,在上面程序中,test1()函數(shù)內(nèi)拋出的異常,可以被上層main()函數(shù)中的catch block中捕獲到。運(yùn)行結(jié)果就不再給出了,大家可以自己編譯運(yùn)行一把,看看運(yùn)行結(jié)果。
另外這個(gè)異常處理框架,與C++中的異常處理模型類似,它也支持try catch塊的多層嵌套。很厲害吧!還是看演示代碼吧!,如下:

#include "ceh.h"

int main(void)
{
// 外層的try catch塊
try
{
// 內(nèi)層的try catch塊
try
{
throw(1, 15, "嵌套在try塊中");
}
catch
{
printf("內(nèi)層的catch塊被執(zhí)行 ");
printf("捕獲到一個(gè)異常,錯(cuò)誤原因是:%s! err_type:%d err_code:%d ",
ceh_ex_info->err_msg, ceh_ex_info->err_type, ceh_ex_info->err_code);

printf("外層的catch塊被執(zhí)行 ");
}
end_try

throw(2, 30, "再拋一個(gè)異常");
}
catch
{
printf("外層的catch塊被執(zhí)行 ");
printf("捕獲到一個(gè)異常,錯(cuò)誤原因是:%s! err_type:%d err_code:%d ",
ceh_ex_info->err_msg, ceh_ex_info->err_type, ceh_ex_info->err_code);
}
end_try
}

  請編譯運(yùn)行一下,程序的運(yùn)行結(jié)果如下:
  內(nèi)層的catch塊被執(zhí)行
  捕獲到一個(gè)異常,錯(cuò)誤原因是:嵌套在try塊中! err_type:1 err_code:15
  外層的catch塊被執(zhí)行
  捕獲到一個(gè)異常,錯(cuò)誤原因是:再拋一個(gè)異常! err_type:2 err_code:30

  還有,這個(gè)異常處理框架也支持對異常的分類處理。這一點(diǎn),也完全是模仿C++中的異常處理模型。不過,由于C語言中,不支持函數(shù)名重載,所以語法上略有不同,還是看演示代碼吧!,如下:

#include "ceh.h"

int main(void)
{
try
{
int i,j;
printf("異常出現(xiàn)前 ");

throw(9, 15, "出現(xiàn)某某異常");

printf("異常出現(xiàn)后 ");
}
// 這里表示捕獲異常類型從4到6的異常
catch_part(4, 6)
{
printf("catch_part(4, 6)塊,被執(zhí)行到 ");
printf("捕獲到一個(gè)異常,錯(cuò)誤原因是:%s! err_type:%d err_code:%d ",
ceh_ex_info->err_msg, ceh_ex_info->err_type, ceh_ex_info->err_code);
}
// 這里表示捕獲異常類型從9到10的異常
catch_part(9, 10)
{
printf("catch_part(9, 10)塊,被執(zhí)行到 ");
printf("捕獲到一個(gè)異常,錯(cuò)誤原因是:%s! err_type:%d err_code:%d ",
ceh_ex_info->err_msg, ceh_ex_info->err_type, ceh_ex_info->err_code);
}
// 這里表示只捕獲異常類型為1的異常
catch_one(1)
{
printf("catch_one(1)塊,被執(zhí)行到 ");
printf("捕獲到一個(gè)異常,錯(cuò)誤原因是:%s! err_type:%d err_code:%d ",
ceh_ex_info->err_msg, ceh_ex_info->err_type, ceh_ex_info->err_code);
}
// 這里表示捕獲所有類型的異常
catch
{
printf("catch塊,被執(zhí)行到 ");
printf("捕獲到一個(gè)異常,錯(cuò)誤原因是:%s! err_type:%d err_code:%d ",
ceh_ex_info->err_msg, ceh_ex_info->err_type, ceh_ex_info->err_code);
}
end_try
}

  請編譯運(yùn)行一下,程序的運(yùn)行結(jié)果如下:
  異常出現(xiàn)前

catch_part(9, 10)塊,被執(zhí)行到
  捕獲到一個(gè)異常,錯(cuò)誤原因是:出現(xiàn)某某異常! err_type:9 err_code:15

  與C++中的異常處理模型相似,它這里的對異常的分類處理不僅支持一維線性的;同樣,它也支持分層的,也即在當(dāng)前的try catch塊中找不到相應(yīng)的catch block,那么它將會到上一層的try catch塊中繼續(xù)尋找。演示代碼如下:

#include "ceh.h"

int main(void)
{
try
{
try
{
throw(1, 15, "嵌套在try塊中");
}
catch_part(4, 6)
{
printf("catch_part(4, 6)塊,被執(zhí)行到 ");
printf("捕獲到一個(gè)異常,錯(cuò)誤原因是:%s! err_type:%d err_code:%d ",
ceh_ex_info->err_msg, ceh_ex_info->err_type, ceh_ex_info->err_code);
}
end_try

printf("這里將不會被執(zhí)行到 ");
}
catch_part(2, 3)
{
printf("catch_part(2, 3)塊,被執(zhí)行到 ");
printf("捕獲到一個(gè)異常,錯(cuò)誤原因是:%s! err_type:%d err_code:%d ",
ceh_ex_info->err_msg, ceh_ex_info->err_type, ceh_ex_info->err_code);
}
// 找到了對應(yīng)的catch block
catch_one(1)
{
printf("catch_one(1)塊,被執(zhí)行到 ");
printf("捕獲到一個(gè)異常,錯(cuò)誤原因是:%s! err_type:%d err_code:%d ",
ceh_ex_info->err_msg, ceh_ex_info->err_type, ceh_ex_info->err_code);
}
catch
{
printf("catch塊,被執(zhí)行到 ");
printf("捕獲到一個(gè)異常,錯(cuò)誤原因是:%s! err_type:%d err_code:%d ",
ceh_ex_info->err_msg, ceh_ex_info->err_type, ceh_ex_info->err_code);
}
end_try

}

  到目前為止,大家是不是已經(jīng)覺得,這個(gè)主人公阿愚封裝的在C語言環(huán)境中異常處理框架,已經(jīng)與C++中的異常處理模型95%相似。無論是它的語法結(jié)構(gòu);還是所完成的功能;以及它使用上的靈活性等。下面我們來看一個(gè)各種情況綜合的例子吧!代碼如下:

#include "ceh.h"

void test1()
{
throw(0, 20, "hahaha");
}

void test()
{
test1();
}

int main(void)
{
try
{
test();
}
catch
{
printf("捕獲到一個(gè)異常,錯(cuò)誤原因是:%s! err_type:%d err_code:%d ",
ceh_ex_info->err_msg, ceh_ex_info->err_type, ceh_ex_info->err_code);
}
end_try

try
{
try
{
throw(1, 15, "嵌套在try塊中");
}
catch
{
printf("捕獲到一個(gè)異常,錯(cuò)誤原因是:%s! err_type:%d err_code:%d ",
ceh_ex_info->err_msg, ceh_ex_info->err_type, ceh_ex_info->err_code);
}
end_try

throw(2, 30, "再拋一個(gè)異常");
}
catch
{
printf("捕獲到一個(gè)異常,錯(cuò)誤原因是:%s! err_type:%d err_code:%d ",
ceh_ex_info->err_msg, ceh_ex_info->err_type, ceh_ex_info->err_code);

try
{
throw(0, 20, "嵌套在catch塊中");
}
catch
{
printf("捕獲到一個(gè)異常,錯(cuò)誤原因是:%s! err_type:%d err_code:%d ",
ceh_ex_info->err_msg, ceh_ex_info->err_type, ceh_ex_info->err_code);
}
end_try
}
end_try
}

  請編譯運(yùn)行一下,程序的運(yùn)行結(jié)果如下:
  捕獲到一個(gè)異常,錯(cuò)誤原因是:hahaha! err_type:0 err_code:20
  捕獲到一個(gè)異常,錯(cuò)誤原因是:嵌套在try塊中! err_type:1 err_code:15
  捕獲到一個(gè)異常,錯(cuò)誤原因是:再拋一個(gè)異常! err_type:2 err_code:30
  捕獲到一個(gè)異常,錯(cuò)誤原因是:嵌套在catch塊中! err_type:0 err_code:20

  最后,為了體會到這個(gè)異常處理框架,更進(jìn)一步與C++中的異常處理模型相似。那就是它還支持異常的重新拋出,以及系統(tǒng)中能捕獲并處理程序中沒有catch到的異常。看代碼吧!如下:

#include "ceh.h"

void test1()
{
throw(0, 20, "hahaha");
}

void test()
{
test1();
}

int main(void)
{
// 這里表示程序中將捕獲浮點(diǎn)數(shù)計(jì)算異常
CEH_init();

try
{
try
{
try
{
double i,j;
j = 0;
// 這里出現(xiàn)浮點(diǎn)數(shù)計(jì)算異常
i = 1/j ;

test();

throw(9, 15, "出現(xiàn)某某異常");
}
end_try
}
catch_part(4, 6)
{
printf("catch_part(4, 6)塊,被執(zhí)行到 ");
printf("捕獲到一個(gè)異常,錯(cuò)誤原因是:%s! err_type:%d err_code:%d ",
ceh_ex_info->err_msg, ceh_ex_info->err_type, ceh_ex_info->err_code);
}
catch_part(2, 3)
{
printf("catch_part(2, 3)塊,被執(zhí)行到 ");
printf("捕獲到一個(gè)異常,錯(cuò)誤原因是:%s! err_type:%d err_code:%d ",
ceh_ex_info->err_msg, ceh_ex_info->err_type, ceh_ex_info->err_code);
}
// 捕獲到上面的異常
catch
{
printf("內(nèi)層的catch塊,被執(zhí)行到 ");
printf("捕獲到一個(gè)異常,錯(cuò)誤原因是:%s! err_type:%d err_code:%d ",
ceh_ex_info->err_msg, ceh_ex_info->err_type, ceh_ex_info->err_code);

// 這里再次把上面的異常重新拋出
rethrow;

printf("這里將不會被執(zhí)行到 ");
}
end_try
}
catch_part(7, 9)
{
printf("catch_part(7, 9)塊,被執(zhí)行到 ");
printf("捕獲到一個(gè)異常,錯(cuò)誤原因是:%s! err_type:%d err_code:%d ",
ceh_ex_info->err_msg, ceh_ex_info->err_type, ceh_ex_info->err_code);

throw(2, 15, "出現(xiàn)某某異常");
}
// 再次捕獲到上面的異常
catch
{
printf("外層的catch塊,被執(zhí)行到 ");
printf("捕獲到一個(gè)異常,錯(cuò)誤原因是:%s! err_type:%d err_code:%d ",
ceh_ex_info->err_msg, ceh_ex_info->err_type, ceh_ex_info->err_code);

// 最后又拋出了一個(gè)異常,
// 但是這個(gè)異常沒有對應(yīng)的catch block處理,所以系統(tǒng)中處理了
throw(2, 15, "出現(xiàn)某某異常");
}
end_try
}

  請編譯運(yùn)行一下,程序的運(yùn)行結(jié)果如下:
  內(nèi)層的catch塊,被執(zhí)行到
  捕獲到一個(gè)異常,錯(cuò)誤原因是:Divide by zero! err_type:-1 err_code:131
  外層的catch塊,被執(zhí)行到
  捕獲到一個(gè)異常,錯(cuò)誤原因是:Divide by zero! err_type:-1 err_code:131
  捕獲到一個(gè)未處理的異常,錯(cuò)誤原因是:出現(xiàn)某某異常! err_type:2 err_code:15
  程序終止!
青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <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>
            国产亚洲精久久久久久| 亚洲专区一二三| 亚洲一区二区高清视频| 91久久久久| 久久久久久久欧美精品| 久久动漫亚洲| 欧美午夜大胆人体| 99国产精品国产精品毛片| 亚洲黄网站黄| 老**午夜毛片一区二区三区| 久久国产精品99精品国产| 欧美性事免费在线观看| 亚洲精品在线视频观看| 亚洲精品日韩激情在线电影| 久久午夜av| 久久尤物视频| 一区二区亚洲欧洲国产日韩| 欧美在线视频观看| 久久精品中文字幕一区| 国产欧美日韩激情| 新67194成人永久网站| 欧美一区二区三区男人的天堂| 欧美视频日韩视频| 日韩视频一区二区在线观看| 在线综合亚洲| 欧美午夜久久| 亚洲欧美国产另类| 欧美一区免费| 好吊一区二区三区| 蜜桃av久久久亚洲精品| 亚洲国产一区二区三区青草影视| 亚洲国产欧美日韩| 欧美国产欧美亚州国产日韩mv天天看完整| 欧美好吊妞视频| 亚洲免费av电影| 欧美午夜片欧美片在线观看| 亚洲网站视频| 久久一区中文字幕| 最近看过的日韩成人| 欧美日韩免费高清| 亚洲女性喷水在线观看一区| 久久xxxx| 亚洲人成绝费网站色www| 欧美日韩播放| 午夜欧美精品久久久久久久| 免费高清在线视频一区·| 亚洲国产精品久久久久婷婷884| 欧美不卡视频| 一区二区国产日产| 久久蜜桃香蕉精品一区二区三区| 亚洲高清在线视频| 欧美日韩视频在线第一区| 亚洲欧美日本伦理| 欧美xart系列在线观看| 亚洲午夜激情网页| 国产小视频国产精品| 免费观看成人www动漫视频| 99精品国产一区二区青青牛奶| 欧美在线视频免费播放| 亚洲欧洲一区二区三区| 国产精品视屏| 欧美成人中文| 欧美综合77777色婷婷| 亚洲欧洲综合另类在线| 久久精品国产欧美亚洲人人爽 | 久久国产综合精品| 亚洲国产成人tv| 久久高清国产| 99riav国产精品| 国产一区在线看| 欧美色大人视频| 免费高清在线一区| 性8sex亚洲区入口| 久久躁狠狠躁夜夜爽| 欧美一二区视频| 亚洲美女av黄| 一色屋精品视频免费看| 国产精品久久久久久av福利软件| 久久九九全国免费精品观看| 亚洲视频视频在线| 亚洲国产精品成人久久综合一区| 久久国产精品一区二区| 亚洲视频免费在线| 亚洲激情中文1区| 国产亚洲精品7777| 国产精品国产亚洲精品看不卡15 | 国产视频观看一区| 欧美日韩一级大片网址| 欧美96在线丨欧| 久久久青草青青国产亚洲免观| 亚洲伊人一本大道中文字幕| 亚洲另类自拍| 亚洲欧洲日本专区| 亚洲福利视频专区| 欧美不卡一区| 免费日韩一区二区| 久热国产精品| 久久久久国产精品www| 香蕉国产精品偷在线观看不卡| 亚洲天堂成人| 亚洲一区二区三区国产| 一本到12不卡视频在线dvd| 亚洲精品免费看| 亚洲日本一区二区三区| 亚洲欧洲综合另类| 亚洲人成在线观看一区二区| 亚洲第一综合天堂另类专| 怡红院精品视频| 亚洲高清一二三区| 亚洲国产精选| 亚洲日本电影| 夜夜嗨av一区二区三区中文字幕| 日韩午夜视频在线观看| 99精品免费视频| 亚洲自啪免费| 久久国产精品第一页| 久久全球大尺度高清视频| 久久在线免费观看| 亚洲福利一区| 日韩一级精品| 亚洲综合不卡| 久久国产欧美日韩精品| 久久在线免费观看| 欧美金8天国| 国产精品性做久久久久久| 国产视频一区在线观看一区免费| 国产日韩欧美制服另类| 亚洲电影免费在线观看| 日韩一本二本av| 欧美一级视频| 欧美成ee人免费视频| 99re66热这里只有精品3直播| 亚洲一级电影| 久久婷婷国产麻豆91天堂| 欧美电影免费观看高清完整版| 欧美精品三级日韩久久| 国产精品综合不卡av| 伊人婷婷欧美激情| 制服丝袜激情欧洲亚洲| 久久精品一二三区| 亚洲欧洲一区二区三区久久| 亚洲欧美激情四射在线日| 久久综合久久综合久久| 欧美亚洲成人网| 在线观看视频一区| 亚洲欧美日韩成人| 欧美激情性爽国产精品17p| 一区二区高清在线| 久久在线视频| 国产精品亚洲综合一区在线观看 | 午夜精品www| 欧美韩日一区| 性欧美暴力猛交69hd| 欧美精品1区| 狠狠色伊人亚洲综合网站色| 亚洲深夜av| 亚洲第一精品在线| 欧美一区二区在线免费播放| 欧美日韩精品| 在线免费观看视频一区| 欧美一区二区三区喷汁尤物| 亚洲精品极品| 久久综合福利| 国内一区二区在线视频观看| 亚洲已满18点击进入久久| 亚洲第一福利在线观看| 欧美专区亚洲专区| 国产精品视频免费在线观看| 日韩一区二区福利| 欧美福利专区| 久久久久久久久久码影片| 国产欧美日韩视频在线观看| 亚洲私人影吧| 亚洲精品国产无天堂网2021| 久久这里只有精品视频首页| 国产亚洲午夜| 欧美在线免费观看亚洲| 制服丝袜激情欧洲亚洲| 欧美日韩午夜在线| 日韩视频免费观看高清在线视频| 免费在线日韩av| 久久久久高清| 在线播放视频一区| 免费欧美在线视频| 久久久免费精品视频| 韩日欧美一区二区三区| 久久久久久穴| 久久精品国产91精品亚洲| 韩国精品在线观看| 久久夜色精品一区| 久久尤物视频| 亚洲精品视频免费观看| 亚洲激情视频在线播放| 欧美精品三区| 一本色道婷婷久久欧美| 99成人精品| 国产精品亚洲综合| 久久久高清一区二区三区| 久久久91精品国产一区二区精品| 曰本成人黄色|