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

MyMSDN

MyMSDN記錄開(kāi)發(fā)新知道

C語(yǔ)言作用域、聲明以及定義

作用域是一個(gè)在絕大多數(shù)(事實(shí)上我沒(méi)有見(jiàn)過(guò)沒(méi)有作用域概念的程序語(yǔ)言)程序語(yǔ)言的必然組成部分。日常良好的使用使用習(xí)慣和程序設(shè)計(jì)風(fēng)格,有時(shí)候讓我們漸漸忘記了這些作用域的準(zhǔn)確定義,因?yàn)樗ǔ](méi)給我們帶來(lái)什么麻煩。這里我將其寫(xiě)下來(lái),僅在勾起大家模糊回憶中清晰的輪廓,也許有你所知的,也許有你所惑的,又或者可能我的理解和你的理解甚至格格不入,煩請(qǐng)大家積極指正。

幾個(gè)概念:

a.外部變量,許多程序設(shè)計(jì)的書(shū)上用“全局變量”一詞,這里做一個(gè)統(tǒng)一,本文中“外部變量”就是所謂的“全局變量”。

b.自動(dòng)變量,許多程序設(shè)計(jì)的書(shū)上用“局部變量”一詞,這里做一個(gè)統(tǒng)一,本文中“自動(dòng)變量”就是所謂的也可以稱(chēng)作“動(dòng)態(tài)局部變量”,與此相對(duì)的還有“靜態(tài)局部變量”,這兩種局部變量的并集就是通常所說(shuō)的“局部變量”了。

這兩種叫法都是有其特定的道理和闡述的意義的。局部變量就是直言了其作用的范圍,它是局部的可見(jiàn)的(這一點(diǎn)您應(yīng)該深有體會(huì))。因?yàn)樵谝粋€(gè)函數(shù)內(nèi)聲明一個(gè)變量,形如int a;它從它的聲明式開(kāi)始,直到該函數(shù)的末尾(以“}”符號(hào)所標(biāo)識(shí))有效。在函數(shù)體的外部,該變量a不存在并且無(wú)效。這樣的聲明事實(shí)上是auto int a;聲明式的一種省略寫(xiě)法,因此稱(chēng)之為“自動(dòng)變量”,因?yàn)樗谠摵瘮?shù)調(diào)用開(kāi)始的時(shí)候初始化內(nèi)存空間,在調(diào)用結(jié)束的時(shí)候?qū)⑨尫旁摵瘮?shù)的內(nèi)存空間,而這一切不需要人工的干預(yù),因此它是自動(dòng)的。

c.靜態(tài)變量,又稱(chēng)之為“靜態(tài)局部變量”,它通常與auto int a;的形式相反,它采用了static關(guān)鍵字進(jìn)行修飾,static int a;。這樣的聲明導(dǎo)致了它在編譯時(shí)就分配了內(nèi)存空間,并在整個(gè)程序的運(yùn)行過(guò)程中持續(xù)有效。唯一的限制是它僅在它所在的函數(shù)范圍內(nèi)有效。

1、外部變量的作用域從它聲明的位置開(kāi)始,到其所在(待編譯)的文件的末尾結(jié)束。

參看以下代碼:

#include <stdio.h>
#include <stdlib.h>
void extern1Processor(void);
int main(void){
/*下面的語(yǔ)句因?yàn)閑xtern1Variable變量的定義在main函數(shù)的后面
* 因此該函數(shù)將產(chǎn)生編譯錯(cuò)誤。
* extern1Variable' undeclared (first use in this function)
printf("main.extern1Variable:%d\n",extern1Variable);*/
      extern1Processor();
      return EXIT_SUCCESS;
}
int extern1Variable = 2003;
/*下面能夠正確使用extern1Variable變量,因?yàn)閑xtern1Variable的
* 定義在extern1Processor(void);方法之上。*/
void extern1Processor(void){
      printf("extern1Processor.extern1Variable:%d\n",extern1Variable);
}

2、如果要在外部變量的定義之前使用該變量,則必須在相應(yīng)的變量聲明中強(qiáng)制地使用關(guān)鍵字extern。

參看以下代碼:

#include <stdio.h>
#include <stdlib.h>
void extern2Processor(void);
int main(void) {
      extern int extern2Variable;
      printf("extern2Processor.extern2Variable:%d\n", extern2Variable);
      extern2Processor();
      return EXIT_SUCCESS;
}
int extern2Variable = 2004;
void extern2Processor(void) {
      printf("extern2Processor.extern2Variable:%d\n", extern2Variable);
}

輸出結(jié)果:

extern2Processor.extern2Variable:2004
extern2Processor.extern2Variable:2004

3、如果外部變量的定義與變量的使用不在同一個(gè)源文件中,則必須在相應(yīng)的變量聲明中強(qiáng)制地使用關(guān)鍵字extern。

假設(shè)在不同的源文件file1.c與file2.c中,我們都需要定義一個(gè)變量int aVariable = 2;時(shí),分別編譯二者,它們將都包含一個(gè)變量aVariable的聲明和定義。但是當(dāng)我們將它們一起加載的時(shí)候,由于它們都是外部變量,相同的變量名導(dǎo)致編譯器不知道它們的主次關(guān)系。因此,這里我們要求程序員一定要用extern將主次分出來(lái)。比如file1.c中int aVariable = 2;這句話聲明了aVariable的類(lèi)型為int,為它分配了sizeof(int)內(nèi)存大小的一塊內(nèi)存空間,它的值為2。在file2.c中我們聲明它extern int aVariable;(這里不能使用extern int aVariable=3;但是可以使用int aVariable;)這句話告訴了編譯器aVariable不是我這個(gè)源文件中進(jìn)行聲明的,它來(lái)自外部(一個(gè)未知的位置)。這樣在單獨(dú)編譯該文件gcc -c file2.c的時(shí)候就不會(huì)因?yàn)槿笔暶魇蕉l(fā)編譯錯(cuò)誤了。

有同學(xué)認(rèn)為這里的int aVariable;是聲明,不是定義,這是一種錯(cuò)誤的觀點(diǎn)。在外部變量中,形如:

file1.c                        file2.c
---------------------------------------------------------------
int aVariable = 3;             int aVariable;
int main(){
……
}

其中的int aVariable;定義了外部變量aVariable,并為之分配了存儲(chǔ)單元

這同時(shí)也成為了外部變量和靜態(tài)變量必須是常量表達(dá)式,且只初始化一次的理由。如果我們對(duì)兩邊都進(jìn)行初始化(定義),編譯器將不知道讓誰(shuí)成為主要初始化的值。事實(shí)上,外部變量和靜態(tài)變量的值初始化過(guò)程是在編譯時(shí)進(jìn)行的,它們的值都被放在靜態(tài)存儲(chǔ)區(qū),也就是我們慣常在匯編中的DATA SEGMENT部分,因此它們必須是常量表達(dá)式,并且有且只有初始化一次,否則我們將可能寫(xiě)出類(lèi)似這樣的語(yǔ)句(而這樣的語(yǔ)句本身就是錯(cuò)誤的):

DATA	SETMENT
INFO1   "INFOMATION1"
        "INFOMATION2"     ;這樣的定義是不允許的
DATA ENDS ……

按照概念extern通常被看作是外部的,因此通常情況下初始化操作一般是在無(wú)extern的聲明式后的,若在extern一邊進(jìn)行初始化,則有違常理(主次不分了)。但是由于將初始化步驟僅放在extern一邊滿足只初始化一次的原則,因此編譯不會(huì)出錯(cuò),但是根據(jù)不同的編譯器可能會(huì)給出警告提示。

參看以下代碼:

包含main的源文件:

#include <stdio.h>
#include <stdlib.h>
void extern3Processor(void);
int main(void) {
      extern3Processor();
      return EXIT_SUCCESS;
}
extern int extern3Variable;
void extern3Processor(void) {
      printf("extern3Processor.extern3Variable:%d\n", extern3Variable);
}

externFile.c文件:(這個(gè)文件很簡(jiǎn)單,就包含了一個(gè)外部變量的定義)

int extern3Variable = 2005;

編譯多個(gè)文件如下:(將.c文件編譯為.o文件,再將這幾個(gè).o文件一起加載到.exe文件中(UNIX中通常為.out文件),通常在對(duì)個(gè)別文件作出修改后,我們只需要重新編譯那個(gè)文件,然后將這些新舊.o文件一起加載到.exe文件中即可。)

gcc -O0 -g3 -Wall -c -fmessage-length=0 -osrc\EffectiveArea.o ..\src\EffectiveArea.c
gcc -O0 -g3 -Wall -c -fmessage-length=0 -osrc\externFile.o ..\src\externFile.c
gcc -oEffectiveArea.exe src\externFile.o src\EffectiveArea.o

輸出結(jié)果:

extern3Processor.extern3Variable:2005

4、之前提到的文字中包含“聲明”和“定義”,它們其實(shí)有著嚴(yán)格的區(qū)別。

聲明:變量聲明用于說(shuō)明變量的屬性(主要是變量的類(lèi)型)

定義:變量定義除了需要聲明之外,還引起了存儲(chǔ)器分配。

5、在步驟3中我們發(fā)現(xiàn)在任意文件中定義的外部變量均可在其它文件中進(jìn)行使用,只要我們使用了extern關(guān)鍵字告訴編譯器這個(gè)變量的聲明式,我們就可以順利通過(guò)編譯。雖然這個(gè)方式能夠?qū)崿F(xiàn)在多個(gè)文件中共享數(shù)據(jù),但是考慮到文件的管理與項(xiàng)目的不可預(yù)測(cè)性,這樣的方式未免讓我們有了些許的擔(dān)心。要是我定義的變量被別人惡意引用了怎么辦?對(duì)于只進(jìn)行讀操作的行為,可能這種災(zāi)難是比較小的,但是對(duì)于寫(xiě)操作的行為,就有可能影響到變量的正確性。

用static聲明限定外部變量和函數(shù),可以將其后聲明的對(duì)象的作用域限定為被編譯源文件的剩余部分。

參看以下代碼:

包含main的源文件:

#include <stdio.h>
#include <stdlib.h>
void static1Processor(void);
int main(void) {
      static1Processor();
      return EXIT_SUCCESS;
}
extern int static1Variable;
void static1Processor(void) {
      printf("static3Processor.static3Variable:%d\n", static1Variable);
}

staticFile.c文件:(這個(gè)文件很簡(jiǎn)單,就包含了一個(gè)外部變量的定義,與externFile.c所不同的是它的定義增加了static關(guān)鍵字修飾):

static int static1Variable = 2006;

輸出結(jié)果(編譯錯(cuò)誤,無(wú)任何輸出結(jié)果):

由于static int static1Variable = 2006;導(dǎo)致了static1Variable變量只對(duì)staticFile.c文件可見(jiàn)。

對(duì)于函數(shù),它也是具有類(lèi)似的限制:

包含main的源文件:

#include <stdio.h>
#include <stdlib.h>
/*兩種定義均無(wú)法引用void static2Processor(void);方法的具體實(shí)現(xiàn)。*/
/*void static2Processor(void);*/
extern void static2Processor(void);
int main(void) {
      static2Processor();
      return EXIT_SUCCESS;
}

staticFile.c:

#include <stdio.h>
static int static2Variable = 2007;
static void static2Processor(void) {
      printf("static2Processor.static1Variable:%d\n", static2Variable);
}

static不僅可以用于聲明外部變量,它還可以用于聲明內(nèi)部變量。static類(lèi)型的內(nèi)部變量同自動(dòng)變量一樣,是某個(gè)特定局部變量,只能在該函數(shù)中使用,但它與自動(dòng)變量不同的是,不管其所在函數(shù)是否被調(diào)用,它將一直存在,而不像自動(dòng)變量那樣,隨著所在函數(shù)的被調(diào)用和退出而存在和消失。換句話說(shuō),static類(lèi)型的內(nèi)部變量只是一種只能在某個(gè)特定函數(shù)中使用但一直占據(jù)存儲(chǔ)空間的變量。

6、因?yàn)閑xtern是為了防止重復(fù)定義,而不是防止重復(fù)聲明。因此對(duì)于不可能產(chǎn)生重復(fù)定義的函數(shù)聲明式來(lái)說(shuō),形如void extern4Processor(void); 這樣的語(yǔ)句可以不用增加extern,因?yàn)樗侵貜?fù)的聲明,而不是定義。

因?yàn)楹瘮?shù)聲明式本身是不允許嵌套的,因此它天生就是外部的,所以默認(rèn)情況下類(lèi)似void FunctionName(){……};的形式都有個(gè)默認(rèn)的修飾符extern void FunctionName(){……};只有標(biāo)識(shí)了static的函數(shù)不是外部函數(shù)。

包含main的源文件:

#include <stdio.h>
#include <stdlib.h>
/*double kinds of declare
* The storage-class specifier, if any,in the declaration specifiers
* shall be either extern or static
.
*/
/*extern void extern4Processor(void);*/
void extern4Processor(void);

int main(void) {
extern4Processor();
return EXIT_SUCCESS;
}

externFile.c:

#include <stdio.h>
int extern4Variable = 2008;
void extern4Processor(void) {
      printf("extern4Processor.extern4Variable:%d\n", extern4Variable);
}

輸出結(jié)果:

extern4Processor.extern4Variable:2008

7、重復(fù)聲明并不可怕,可怕的是重復(fù)定義。

參看以下代碼:

包含main的源文件:

#include <stdio.h>
#include <stdlib.h>
char repeatVariableWithoutDefinition1;	/*declear thrice no hurt*/
char repeatVariableWithoutDefinition1;	/*declear thrice no hurt*/
char repeatVariableWithoutDefinition1;	/*declear thrice no hurt*/
void repeatVariableWithoutDefinition1Func(void);
int main(void) {
      repeatVariableWithoutDefinition1Func();
      return EXIT_SUCCESS;
}
void repeatVariableWithoutDefinition1Func(void) {
      repeatVariableWithoutDefinition1 = 'v';
      printf("repeatVariableWithoutDefinition1:%c\n",
            repeatVariableWithoutDefinition1);
}

otherFile.c:

char repeatVariableWithoutDefinition1;
char repeatVariableWithoutDefinition1;

它的無(wú)害是因?yàn)樗鼈兌际窃诰幾g時(shí)進(jìn)行分配的,它們并沒(méi)有并存,只是僅存了一個(gè)罷了。

8、至此,上面已經(jīng)生成了許多的聲明/定義。可以看出,我們的函數(shù)是可以跨文件調(diào)用的,而且每次調(diào)用都要寫(xiě)函數(shù)聲明式。為此,C語(yǔ)言支持“頭文件”,也就是我們經(jīng)常看到的#include "xxxxx.h"或#include <stdio.h>。其中include <>的時(shí)候,將根據(jù)相應(yīng)規(guī)則查找該文件(通常在編譯器所在Includes文件夾內(nèi)找),但是""的時(shí)候總是先在源文件(*.c)所在文件夾查找,若找不到則使用與#include <>相同規(guī)則進(jìn)行查找。

#include是一個(gè)C預(yù)處理器,它所指定的文件將在編譯時(shí),將其中內(nèi)容原封不動(dòng)地替換到#include語(yǔ)句所在的位置。這樣的話,我們就有能力實(shí)現(xiàn)了一個(gè)地方定義函數(shù),多個(gè)地方調(diào)用的功能了。(每次重新寫(xiě)聲明式難免會(huì)造成:1、手誤,導(dǎo)致拼寫(xiě)錯(cuò)誤;2、修改維護(hù)困難,可能會(huì)漏掉,但又機(jī)緣巧合不會(huì)出錯(cuò)。)

#include頭文件中可以推薦包含文件聲明、宏替換等(事實(shí)上可以包含任何的文本)。

因?yàn)榭梢园魏蔚奈谋荆晕覀冇锌赡芤驗(yàn)橹貜?fù)定義而導(dǎo)致一些不必要的麻煩,因?yàn)楫吘怪貜?fù)定義是沒(méi)有任何意義的,還增加編譯時(shí)間。因此在頭文件的內(nèi)部,我們通常采用條件包含來(lái)避免重復(fù)地包含。

參看以下代碼:

#ifndef EFFECTIVEAREA_H_
#define EFFECTIVEAREA_H_
/*define the content of EffectiveArea.h here!*/
#endif /* EFFECTIVEAREA_H_ */

注意,宏名字是全局有效的,因此我們必須保證它的唯一性,否則,在判斷的時(shí)候,就會(huì)因?yàn)閮蓚€(gè)頭文件之間的互相排斥(被認(rèn)為是同一個(gè)文件),但事實(shí)上它們之間只是錯(cuò)誤地定義了名字。為此我們可以用文件名的等價(jià)轉(zhuǎn)換來(lái)包含它們,因?yàn)槲募俏ㄒ坏摹#ㄎ募穆窂剑ǔN覀儗㈩^文件放入同一個(gè)文件夾下,因此我們可以保證在同級(jí)文件夾下的文件名的唯一性。)

這樣我們就可以隨心所欲地包含頭文件了,而不必?fù)?dān)心重復(fù)包含頭文件所帶來(lái)的壞處了。

9、對(duì)于函數(shù)簽名聲明返回值類(lèi)型為int的可以省略(不推薦(引發(fā)警告))。

參看以下代碼:

#include <stdio.h>
#include <stdlib.h>
/*We can omit the declaration of function here only when it's returnType is int.
* It only cause compile warning "implicit declaration of function 'nodeclare1Func'"
* Because the default function returnType is 'int'. */
/*But we suggest you explicit declare your function here.*/
/*int nodeclare1Func(int param1); */
/*We can not omit anything here!*/
char nodeclare2Func(void);
int main(void) {
      nodeclare1Func(2009);
      nodeclare2Func();
      return EXIT_SUCCESS;
}
int nodeclare1Func(int param1) {
printf("nodeclare1Func.param1:%d\n", param1);
      return EXIT_SUCCESS;
}
char nodeclare2Func(void) {
printf("nodeclare2Func.i:%d\n", 2010);
      return 'c';
}

作用域的內(nèi)容并不難,掌握它們雖然不需要花費(fèi)太多的時(shí)間(當(dāng)然我還是比較推崇認(rèn)真掌握了),但是我們應(yīng)該從使用習(xí)慣上做到合理準(zhǔn)確地應(yīng)用這些特性。對(duì)于出現(xiàn)的一些錯(cuò)誤能夠給出合理的解釋。

posted on 2008-08-19 20:42 volnet 閱讀(5489) 評(píng)論(13)  編輯 收藏 引用 所屬分類(lèi): C/C++

評(píng)論

# re: C語(yǔ)言作用域、聲明以及定義[未登錄](méi) 2008-08-20 09:53 raof01

1、……到其所在*編譯單元*的結(jié)束。如果“到其所在(待編譯)的文件的末尾結(jié)束”,那頭文件中定義的外部變量就會(huì)……基本沒(méi)有作用。

2、extern表示被聲明的variable或者函數(shù)在其他地方定義并分配存儲(chǔ)空間了。如果使用了extern,就有可能不必include相應(yīng)的頭文件。

3、“如果外部變量的定義與變量的使用不在同一個(gè)源文件中,則必須在相應(yīng)的變量聲明中強(qiáng)制地使用關(guān)鍵字extern。”——聲明/定義變量時(shí),無(wú)論是全局還是局部變量,不帶extern永遠(yuǎn)是定義。

“通常在對(duì)個(gè)別文件作出修改后,我們只需要重新編譯那個(gè)文件”——這更多的是模塊間的依賴(lài)問(wèn)題。

“這一點(diǎn)給人的感覺(jué)static非常像C++/C#/Java中的private修飾符,即僅對(duì)當(dāng)前文件(其它語(yǔ)言中可能并非文件)有效。”——你該好好理解一下OO了。static在C++中一種意思就是與C一樣。C#有assembly的概念,其internal更像static,但又不完全像。Java我不熟,不過(guò)也絕不是你說(shuō)的這樣。private是訪問(wèn)權(quán)限修飾符(access permission modifier),而static是存儲(chǔ)說(shuō)明(storage class specifier),兩者是*完全*不同的概念。——強(qiáng)烈要求你仔細(xì)閱讀相關(guān)書(shū)籍以免誤導(dǎo)大家。

char repeatVariableWithoutDefinition1; /*declear thrice no hurt*/——真的no hurt嗎?

強(qiáng)調(diào)一點(diǎn):編譯單元和源文件是有區(qū)別的。  回復(fù)  更多評(píng)論   

# re: C語(yǔ)言作用域、聲明以及定義 2008-08-20 11:21 volnet

@raof01
感謝非常細(xì)心的點(diǎn)評(píng)
對(duì)于private的部分,我可沒(méi)劃上等號(hào)呢,我只能說(shuō)它們有部分形式上的相同,但絕不相等。。。。我說(shuō)的當(dāng)前文件,其間不一定是文件的概念,這個(gè)可能要意會(huì)了~~~  回復(fù)  更多評(píng)論   

# re: C語(yǔ)言作用域、聲明以及定義[未登錄](méi) 2008-08-20 17:38 raof01

@volnet
兩個(gè)風(fēng)牛馬不相及的東西被你說(shuō)成相似——熊貓和小熊貓。

感覺(jué)你自己的理解還是比較混亂。
  回復(fù)  更多評(píng)論   

# re: C語(yǔ)言作用域、聲明以及定義 2008-08-20 21:33 volnet

@raof01
他們?cè)诳梢?jiàn)性方面有些許感性上的相似吧
至于其它方面,本來(lái)就是兩個(gè)不同的概念,怎么可能說(shuō)完全一致呢~呵呵

我還是把它刪了吧,哈,理解一個(gè)概念本來(lái)沒(méi)必要從另一個(gè)概念入手的,當(dāng)時(shí)順手一寫(xiě)釀成大禍  回復(fù)  更多評(píng)論   

# re: C語(yǔ)言作用域、聲明以及定義[未登錄](méi) 2008-08-21 08:56 raof01

@volnet
互相學(xué)習(xí),互相促進(jìn)而已。你到我的博客文章里去找聯(lián)系方式吧,哈哈
  回復(fù)  更多評(píng)論   

# re: C語(yǔ)言作用域、聲明以及定義 2008-08-21 09:56 volnet

@raof01
用Gtalk加你了,不知道是否正確,還是用Hotmail?  回復(fù)  更多評(píng)論   

# re: C語(yǔ)言作用域、聲明以及定義[未登錄](méi) 2008-08-21 13:06 raof01

@volnet
用mail吧,不習(xí)慣聊天  回復(fù)  更多評(píng)論   

# re: C語(yǔ)言作用域、聲明以及定義 2008-08-21 23:49 volnet

@raof01
呵呵,ok  回復(fù)  更多評(píng)論   

# re: C語(yǔ)言作用域、聲明以及定義 2008-08-24 16:04 dell

如果外部變量的定義與變量的使用不在同一個(gè)源文件中,則必須在相應(yīng)的變量聲明中強(qiáng)制地使用關(guān)鍵字extern。忽略它很會(huì)導(dǎo)致問(wèn)題,讓人困惑。  回復(fù)  更多評(píng)論   

# re: C語(yǔ)言作用域、聲明以及定義[未登錄](méi) 2008-08-26 09:00 raof01

@dell
會(huì)導(dǎo)致什么問(wèn)題?怎么讓人困惑?說(shuō)話別不明不白的  回復(fù)  更多評(píng)論   

# re: C語(yǔ)言作用域、聲明以及定義[未登錄](méi) 2008-08-28 14:49 raof01

參考這里:http://m.shnenglu.com/jinq0123/
還有這里:http://blog.chinaunix.net/u/12783/showart_548200.html  回復(fù)  更多評(píng)論   

# re: C語(yǔ)言作用域、聲明以及定義 2009-10-16 22:05 你好!

能否把我給你的評(píng)論(最前面的兩條中有)刪掉,我的留言中使用了郵件地址,收到了無(wú)數(shù)的垃圾郵件,煩都煩死了。如果可以,真的不勝感激。  回復(fù)  更多評(píng)論   

# re: C語(yǔ)言作用域、聲明以及定義 2009-10-17 12:09 volnet

@你好!
已刪除!  回復(fù)  更多評(píng)論   

特殊功能
 
青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <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>
            久久久久一区二区三区| 国内精品免费在线观看| 国产一区二区三区免费观看 | 午夜精品三级视频福利| 亚洲免费在线| 欧美一区激情| 欧美成人亚洲| 国产精品草草| 亚洲欧洲精品一区二区三区波多野1战4 | 久久久精品国产免大香伊| 性欧美xxxx视频在线观看| 亚洲午夜羞羞片| 亚洲免费在线播放| 欧美一区二区在线看| 久久久久一区二区三区| 欧美激情va永久在线播放| 亚洲国内高清视频| 在线亚洲自拍| 久久在线免费| 欧美国产日韩一区二区| 欧美日韩中文在线| 男同欧美伦乱| 亚洲国产日本| 亚洲免费在线精品一区| 久久综合伊人77777蜜臀| 91久久极品少妇xxxxⅹ软件| 在线视频你懂得一区二区三区| 欧美中文在线免费| 欧美日韩一区三区四区| 狠狠色狠狠色综合日日91app| 日韩香蕉视频| 欧美电影免费观看大全| 亚洲你懂的在线视频| 牛牛国产精品| 国产一区视频网站| 亚洲一级免费视频| 亚洲动漫精品| 久久久欧美一区二区| 国产精品性做久久久久久| 亚洲乱码精品一二三四区日韩在线 | 欧美激情视频一区二区三区不卡| 一区二区三区www| 欧美aⅴ一区二区三区视频| 国产亚洲aⅴaaaaaa毛片| 亚洲午夜女主播在线直播| 亚洲激情成人网| 久久综合久色欧美综合狠狠| 国产婷婷精品| 午夜精品网站| 亚洲视频狠狠| 国产精品白丝jk黑袜喷水| 亚洲高清视频在线| 六十路精品视频| 久久久999精品视频| 国产小视频国产精品| 亚洲尤物在线视频观看| 亚洲免费观看高清完整版在线观看熊 | 国产日韩亚洲欧美综合| 亚洲欧美另类国产| 亚洲精品一区二区三区樱花| 欧美jizz19hd性欧美| 亚洲一区在线视频| 国产精品久久久久aaaa樱花| 99视频一区二区| 亚洲国产精品一区二区www在线| 麻豆成人91精品二区三区| 午夜精品福利一区二区蜜股av| 欧美大片91| 中文高清一区| 免费亚洲视频| 欧美 日韩 国产精品免费观看| 精品电影在线观看| 农村妇女精品| 欧美麻豆久久久久久中文| 一区二区三区视频在线播放| 久久九九99视频| 亚洲欧美卡通另类91av | 欧美大片在线观看一区二区| 亚洲第一福利社区| 欧美激情1区2区3区| 欧美激情成人在线| 99国产精品视频免费观看| 99精品国产在热久久下载| 欧美日韩一区二区欧美激情| 香蕉亚洲视频| 久久精品72免费观看| 国产一区二区看久久| 欧美电影免费网站| 国产精品国产三级国产aⅴ浪潮 | 狠狠久久亚洲欧美专区| 免费在线看一区| 欧美日韩福利| 羞羞色国产精品| 久久久综合网站| 亚洲精品一二三区| 亚洲视频二区| 亚洲高清在线| 亚洲激情综合| 国产主播喷水一区二区| 亚洲国产精品999| 国产精品chinese| 免播放器亚洲一区| 欧美日韩免费高清| 欧美一级网站| 欧美日产一区二区三区在线观看| 久久久精品国产99久久精品芒果| 欧美激情精品久久久久久变态| 欧美专区18| 欧美日韩一区免费| 欧美激情按摩在线| 激情五月***国产精品| 一区二区三区国产精华| 91久久综合亚洲鲁鲁五月天| 先锋a资源在线看亚洲| 亚洲无毛电影| 欧美黑人在线播放| 奶水喷射视频一区| 精品福利电影| 久久激情五月婷婷| 欧美一区二区三区免费看| 欧美日韩你懂的| 亚洲国产一区二区视频 | 久久精品二区| 欧美日韩一区二区在线观看视频| 亚洲电影av在线| 在线成人黄色| 久久精品国产久精国产一老狼| 欧美一级日韩一级| 国产精品国产三级国产aⅴ9色| 亚洲七七久久综合桃花剧情介绍| 亚洲韩日在线| 免费观看亚洲视频大全| 久久精品成人| 亚洲欧美久久久| 在线视频观看日韩| 久久精品国产成人| 久久精品视频导航| 国产日韩精品视频一区| 中文一区二区| 性欧美暴力猛交69hd| 国产精品美女www爽爽爽视频| 一区二区日韩伦理片| 亚洲欧美欧美一区二区三区| 国产精品网站在线| 欧美一区二区私人影院日本| 久久久综合精品| 黄色精品一区二区| 免费亚洲一区| 日韩午夜一区| 午夜在线视频观看日韩17c| 国产欧美日韩精品a在线观看| 午夜综合激情| 欧美顶级艳妇交换群宴| 艳女tv在线观看国产一区| 欧美日韩在线三区| 亚洲尤物视频网| 久久影院午夜论| 日韩视频一区| 国产女人aaa级久久久级| 亚洲婷婷国产精品电影人久久| 午夜视黄欧洲亚洲| 一区二区亚洲精品| 欧美精品一卡| 亚洲综合成人在线| 蜜桃伊人久久| 亚洲天堂av在线免费| 国产精品一区二区女厕厕| 久久久久久欧美| 亚洲免费电影在线| 久久亚洲欧美| 中文亚洲免费| 伊人成人开心激情综合网| 欧美精品一区二区三| 欧美亚洲综合另类| 亚洲人成网站在线播| 久久精品人人| 在线视频精品一| 激情视频一区| 国产精品一区一区| 欧美精品在欧美一区二区少妇| 亚洲欧美精品伊人久久| 亚洲啪啪91| 欧美大片免费久久精品三p| 亚洲视频免费观看| 亚洲国产成人一区| 国产伪娘ts一区| 欧美人成网站| 乱中年女人伦av一区二区| 亚洲一区日韩| 亚洲免费成人av| 亚洲激情欧美| 免费观看日韩| 久久久久欧美精品| 亚洲欧美不卡| 一区二区三区鲁丝不卡| 91久久久一线二线三线品牌| 国产在线精品成人一区二区三区| 国产精品久久久久久久午夜| 欧美区高清在线| 欧美精品国产精品|