久久精品国产精品国产精品污,男人扒开添女人下部免费视频,一级国产69式性姿势免费视频,夜鲁夜鲁很鲁在线视频 视频,欧美丰满少妇一区二区三区,国产偷国产偷亚洲高清人乐享,中文 在线 日韩 亚洲 欧美,熟妇人妻无乱码中文字幕真矢织江,一区二区三区人妻制服国产

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

C语言编程规范 clean code

發(fā)布時(shí)間:2023/12/20 编程问答 36 豆豆
生活随笔 收集整理的這篇文章主要介紹了 C语言编程规范 clean code 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

目的

規(guī)則并不是完美的,通過禁止在特定情況下有用的特性,可能會(huì)對(duì)代碼實(shí)現(xiàn)造成影響。但是我們制定規(guī)則的目的“為了大多數(shù)程序員可以得到更多的好處”, 如果在團(tuán)隊(duì)運(yùn)作中認(rèn)為某個(gè)規(guī)則無法遵循,希望可以共同改進(jìn)該規(guī)則。參考該規(guī)范之前,希望您具有相應(yīng)的C語言基礎(chǔ)能力,而不是通過該文檔來學(xué)習(xí)C語言。

  • 了解C語言的ISO標(biāo)準(zhǔn);

  • 熟知C語言的基本語言特性;

  • 了解C語言的標(biāo)準(zhǔn)庫;

  • 總體原則

    代碼需要在保證功能正確的前提下,滿足可讀、可維護(hù)、安全、可靠、可測試、高效、可移植的特征要求。

    約定

    規(guī)則:編程時(shí)必須遵守的約定
    建議:編程時(shí)必須加以考慮的約定

    無論是“規(guī)則”還是“建議”,都必須理解該條目這么規(guī)定的原因,并努力遵守。

    例外

    在不違背總體原則,經(jīng)過充分考慮,有充足的理由的前提下,可以適當(dāng)違背規(guī)范中約定。
    例外破壞了代碼的一致性,請(qǐng)盡量避免。“規(guī)則”的例外應(yīng)該是極少的。

    下列情況,應(yīng)風(fēng)格一致性原則優(yōu)先:
    修改外部開源代碼、第三方代碼時(shí),應(yīng)該遵守開源代碼、第三方代碼已有規(guī)范,保持風(fēng)格統(tǒng)一。

    1 命名

    命名包括文件、函數(shù)、變量、類型、宏等命名。

    命名被認(rèn)為是軟件開發(fā)過程中最困難,也是最重要的事情。
    標(biāo)識(shí)符的命名要清晰、明了,有明確含義,符合閱讀習(xí)慣,容易理解。

    統(tǒng)一的命名風(fēng)格是一致性原則最直接的體現(xiàn)。

    總體風(fēng)格

    駝峰風(fēng)格(CamelCase)
    大小寫字母混用,單詞連在一起,不同單詞間通過單詞首字母大寫來分開。
    按連接后的首字母是否大寫,又分:?大駝峰(UpperCamelCase)和小駝峰(lowerCamelCase)

    規(guī)則1.1 標(biāo)識(shí)符命名使用駝峰風(fēng)格

    類型

    命名風(fēng)格

    函數(shù),結(jié)構(gòu)體類型,枚舉類型,聯(lián)合體類型大駝峰
    變量,函數(shù)參數(shù),宏參數(shù),結(jié)構(gòu)體中字段,聯(lián)合體中成員小駝峰
    宏,常量,枚舉值,goto 標(biāo)簽全大寫,下劃線分割

    注意:
    上表中常量是指,全局作用域下,const 修飾的基本數(shù)據(jù)類型、枚舉、字符串類型的變量,不包括數(shù)組、結(jié)構(gòu)體和聯(lián)合體。
    上表中變量是指除常量定義以外的其他變量,均使用小駝峰風(fēng)格。

    建議1.1 作用域越大,命名應(yīng)越精確

    C 與 C++ 不同,沒有名字空間,沒有類,所以全局作用域下的標(biāo)識(shí)符命名要考慮不要沖突。
    對(duì)于全局函數(shù)、全局變量、宏、類型名、枚舉名的命名,應(yīng)當(dāng)精確描述并全局唯一。

    例:

    int GetCount(void); // Bad: 描述不精確 int GetActiveConnectCount(void); // Good

    為了命名更精確,必要時(shí)可以增加模塊前綴。
    模塊前綴與命名主體之間,按駝峰方式連接。
    示例:

    int PrefixFuncName(void); // OK: 駝峰方式,形式上無前綴,內(nèi)容上有前綴enum XxxMyEnum { // OK.... };

    文件命名

    建議1.2 文件命名統(tǒng)一采用小寫字符

    文件名命名只允許使用小寫字母、數(shù)字以及下劃線(_)。
    文件名應(yīng)盡量簡短、準(zhǔn)確、無二義性。
    不大小寫混用的原因是,不同系統(tǒng)對(duì)文件名大小寫處理會(huì)不同(如 MicroSoft 的 DOS, Windows 系統(tǒng)不區(qū)分大小寫,但是 Unix / Linux, Mac 系統(tǒng)則默認(rèn)區(qū)分)。

    好的命名舉例:
    dhcp_user_log.c

    壞的命名舉例:
    dhcp_user-log.c: 不推薦用'-'分隔
    dhcpuserlog.c: 未分割單詞,可讀性差

    函數(shù)命名

    函數(shù)命名統(tǒng)一使用大駝峰風(fēng)格。

    建議1.3 函數(shù)的命名遵循閱讀習(xí)慣

    動(dòng)作類函數(shù)名,可以使用動(dòng)賓結(jié)構(gòu)。如:

    AddTableEntry() // OK DeleteUser() // OK GetUserInfo() // OK

    判斷型函數(shù),可以用形容詞,或加 is:

    DataReady() // OK IsRunning() // OK JobDone() // OK

    數(shù)據(jù)型函數(shù):

    TotalCount() // OK GetTotalCount() // OK

    變量命名

    變量命名使用小駝峰風(fēng)格,包括全局變量,局部變量,函數(shù)聲明或定義中的參數(shù),帶括號(hào)宏中的參數(shù)。

    規(guī)則1.2 全局變量應(yīng)增加 'g_' 前綴,函數(shù)內(nèi)靜態(tài)變量命名不需要加特殊前綴

    全局變量應(yīng)當(dāng)盡量少使用,使用時(shí)應(yīng)特別注意,所以加上前綴用于視覺上的突出,促使開發(fā)人員對(duì)這些變量的使用更加小心。
    全局靜態(tài)變量命名與全局變量相同,函數(shù)內(nèi)的靜態(tài)變量命名與普通局部變量相同。

    int g_activeConnectCount;void Func(void) {static int pktCount = 0; ... }

    注意:常量本質(zhì)也是全局變量,但如果命名風(fēng)格是全大寫,下劃線連接的格式,則不適用當(dāng)前規(guī)則。

    建議1.4 局部變量應(yīng)該簡短,且能夠表達(dá)相關(guān)含義

    函數(shù)局部變量的命名,在能夠表達(dá)相關(guān)含義的前提下,應(yīng)該簡短。

    如下:

    int Func(...) {enum PowerBoardStatus powerBoardStatusOfSlot; // Not good: 局部變量有點(diǎn)長powerBoardStatusOfSlot = GetPowerBoardStatus(slot);if (powerBoardStatusOfSlot == POWER_OFF) {...} ... }

    更好的寫法:

    int Func(...) { enum PowerBoardStatus status; // Good: 結(jié)合上下文,status 已經(jīng)能明確表達(dá)意思status = GetPowerBoardStatus(slot);if (status == POWER_OFF) {...}... }

    類似的, tmp 可以用來稱呼任意類型的臨時(shí)變量。
    過短的變量命名應(yīng)慎用,但有時(shí)候,單字符變量也是允許的,如用于循環(huán)語句中的計(jì)數(shù)器變量:

    int i; ... for (i = 0; i < COUNTER_RANGE; i++) {... }

    或一些簡單的數(shù)學(xué)計(jì)算函數(shù)中的變量:

    int Mul(int a, int b) {return a * b; }

    類型命名

    類型命名采用大駝峰命名風(fēng)格。
    類型包括結(jié)構(gòu)體、聯(lián)合體、枚舉類型名。

    例:

    struct MsgHead {enum MsgType type;int msgLen;char *msgBuf; };union Packet {struct SendPacket send;struct RecvPacket recv; };enum BaseColor {RED, // 注意,枚舉類型是大駝峰,枚舉值應(yīng)使用宏風(fēng)格GREEN,BLUE };typedef int (*NodeCmpFunc)(struct Node *a, struct Node *b);

    通過 typedef 對(duì)結(jié)構(gòu)體、聯(lián)合體、枚舉起別名時(shí),盡量使用匿名類型。
    若需要指針自嵌套,可以增加 'tag' 前綴或下劃線后綴。

    typedef struct { // Good: 無須自嵌套,使用匿名結(jié)構(gòu)體int a;int b; } MyType; // 結(jié)構(gòu)體別名用大駝峰風(fēng)格typedef struct tagNode { // Good: 使用 tag 前綴。這里也可以使用 'Node_'代替也可以。struct tagNode *prev;struct tagNode *next; } Node; // 類型主體用大駝峰風(fēng)格

    宏、常量、枚舉命名

    宏、枚舉值采用全大寫,下劃線連接的格式。
    常量推薦采用全大寫,下劃線連接風(fēng)格。作為全局變量,也可以保持與普通全局變量命名風(fēng)格相同。
    這里常量如前文定義,是指基本數(shù)據(jù)類型、枚舉、字符串類型的全局 const 變量。

    函數(shù)式宏,如果功能上可以替代函數(shù),也可以與函數(shù)的命名方式相同,使用大駝峰命名風(fēng)格。
    這種做法會(huì)讓宏與函數(shù)看起來一樣,容易混淆,需要特別注意。

    宏舉例:

    #define PI 3.14 #define MAX(a, b) (((a) < (b)) ? (b) : (a))#ifdef SOME_DEFINE void Bar(int); #define Foo(a) Bar(a) // 特殊場景,用大駝峰風(fēng)格命名函數(shù)式宏 #else void Foo(int); #endif

    常量舉例:

    const int VERSION = 200; // OK.const enum Color DEFAULT_COLOR = BLUE; // OK.const char PATH_SEP = '/'; // OK.const char * const GREETINGS = "Hello, World!"; // OK.

    非常量舉例:

    // 結(jié)構(gòu)體類型,不符合常量定義 const struct MyType g_myData = { ... }; // OK: 用小駝峰// 數(shù)組類型,不符合常量定義 const int g_xxxBaseValue[4] = { 1, 2, 4, 8 }; // OK: 用小駝峰int Foo(...) {// 局部作用域,不符合常量定義const int bufSize = 100; // OK: 用小駝峰... }

    枚舉舉例:

    // 注意,枚舉類型名用大駝峰,其下面的取值是全大寫,下劃線相連 enum BaseColor {RED,GREEN,BLUE };

    建議1.5 避免函數(shù)式宏中的臨時(shí)變量命名污染外部作用域

    首先,盡量少的使用函數(shù)式宏。

    當(dāng)函數(shù)式宏需要定義局部變量時(shí),為了防止跟外部函數(shù)中的局部變量有命名沖突。

    后置下劃線,是一種解決方案。例:

    #define SWAP_INT(a, b) do { \int tmp_ = a; \a = b; \b = tmp_; \ } while (0)

    2 排版格式

    行寬

    建議2.1 行寬不超過 120 個(gè)字符

    代碼行寬不宜過長,否則不利于閱讀。
    控制行寬長度可以間接的引導(dǎo)開發(fā)去縮短函數(shù)、變量的命名,減少嵌套的層數(shù),提升代碼可讀性。
    強(qiáng)烈建議和要求每行字符數(shù)不要超過?120?個(gè);除非超過?120?能顯著增加可讀性,并且不會(huì)隱藏信息。
    雖然現(xiàn)代顯示器分辨率已經(jīng)很高,但是行寬過長,反而提高了閱讀理解的難度;跟本規(guī)范提倡的“清晰”、“簡潔”原則相背。

    如下場景不宜換行,可以例外:

    • 換行會(huì)導(dǎo)致內(nèi)容截?cái)?#xff0c;無法被方便查找(grep)的字符串,如命令行或 URL 等等。包含這些內(nèi)容的代碼或注釋,可以適當(dāng)例外。

    • #include / #error 語句可以超出行寬要求,但是也需要盡量避免。

    例:

    #ifndef XXX_YYY_ZZZ #error Header aaaa/bbbb/cccc/abc.h must only be included after xxxx/yyyy/zzzz/xyz.h #endif

    縮進(jìn)

    規(guī)則2.1 使用空格進(jìn)行縮進(jìn),每次縮進(jìn)4個(gè)空格

    只允許使用空格(space)進(jìn)行縮進(jìn),每次縮進(jìn)為?4?個(gè)空格。不允許使用Tab鍵進(jìn)行縮進(jìn)。
    當(dāng)前幾乎所有的集成開發(fā)環(huán)境(IDE)和代碼編輯器都支持配置將Tab鍵自動(dòng)擴(kuò)展為4空格輸入,請(qǐng)配置你的代碼編輯器支持使用空格進(jìn)行縮進(jìn)。

    大括號(hào)

    規(guī)則2.2 使用 K&R 縮進(jìn)風(fēng)格

    K&R風(fēng)格
    換行時(shí),函數(shù)左大括號(hào)另起一行放行首,并獨(dú)占一行;其他左大括號(hào)跟隨語句放行末。
    右大括號(hào)獨(dú)占一行,除非后面跟著同一語句的剩余部分,如 do 語句中的 while,或者 if 語句的 else/else if,或者逗號(hào)、分號(hào)。

    如:

    struct MyType { // Good: 跟隨語句放行末,前置1空格... }; // Good: 右大括號(hào)后面緊跟分號(hào)int Foo(int a) { // Good: 函數(shù)左大括號(hào)獨(dú)占一行,放行首if (...) {...} else { // Good: 右大括號(hào)與 else 語句在同一行...} // Good: 右大括號(hào)獨(dú)占一行 }

    函數(shù)聲明和定義

    規(guī)則2.3 函數(shù)聲明、定義的返回類型和函數(shù)名在同一行;函數(shù)參數(shù)列表換行時(shí)應(yīng)合理對(duì)齊

    在聲明和定義函數(shù)的時(shí)候,函數(shù)的返回值類型應(yīng)該和函數(shù)名在同一行。

    函數(shù)參數(shù)列表換行時(shí),應(yīng)合理對(duì)齊。
    參數(shù)列表的左圓括號(hào)總是和函數(shù)名在同一行,不要單獨(dú)一行;右圓括號(hào)總是跟隨最后一個(gè)參數(shù)。

    換行舉例:

    ReturnType FunctionName(ArgType paramName1, ArgType paramName2) // Good:全在同一行 {... }ReturnType VeryVeryVeryLongFunctionName(ArgType paramName1, // 行寬不滿足所有參數(shù),進(jìn)行換行ArgType paramName2, // Good:和上一行參數(shù)對(duì)齊ArgType paramName3) {... }ReturnType LongFunctionName(ArgType paramName1, ArgType paramName2, // 行寬限制,進(jìn)行換行ArgType paramName3, ArgType paramName4, ArgType paramName5) // Good: 換行后 4 空格縮進(jìn) {... }ReturnType ReallyReallyReallyReallyLongFunctionName( // 行寬不滿足第1個(gè)參數(shù),直接換行ArgType paramName1, ArgType paramName2, ArgType paramName3) // Good: 換行后 4 空格縮進(jìn) {... }

    函數(shù)調(diào)用

    規(guī)則2.4 函數(shù)調(diào)用參數(shù)列表換行時(shí)保持參數(shù)進(jìn)行合理對(duì)齊

    函數(shù)調(diào)用時(shí),函數(shù)參數(shù)列表如果換行,應(yīng)該進(jìn)行合理的參數(shù)對(duì)齊。
    左圓括號(hào)總是跟函數(shù)名,右圓括號(hào)總是跟最后一個(gè)參數(shù)。

    換行舉例:

    ReturnType result = FunctionName(paramName1, paramName2); // Good:函數(shù)參數(shù)放在一行ReturnType result = FunctionName(paramName1,paramName2, // Good:保持與上方參數(shù)對(duì)齊paramName3);ReturnType result = FunctionName(paramName1, paramName2, paramName3, paramName4, paramName5); // Good:參數(shù)換行,4 空格縮進(jìn)ReturnType result = VeryVeryVeryLongFunctionName( // 行寬不滿足第1個(gè)參數(shù),直接換行paramName1, paramName2, paramName3); // 換行后,4 空格縮進(jìn)

    如果函數(shù)調(diào)用的參數(shù)存在內(nèi)在關(guān)聯(lián)性,按照可理解性優(yōu)先于格式排版要求,對(duì)參數(shù)進(jìn)行合理分組換行。

    // Good:每行的參數(shù)代表一組相關(guān)性較強(qiáng)的數(shù)據(jù)結(jié)構(gòu),放在一行便于理解 int result = DealWithStructureLikeParams(left.x, left.y, // 表示一組相關(guān)參數(shù)right.x, right.y); // 表示另外一組相關(guān)參數(shù)

    條件語句

    規(guī)則2.5 條件語句必須要使用大括號(hào)

    我們要求條件語句都需要使用大括號(hào),即便只有一條語句。
    理由:

    • 代碼邏輯直觀,易讀;

    • 在已有條件語句代碼上增加新代碼時(shí)不容易出錯(cuò);

    • 對(duì)于在條件語句中使用函數(shù)式宏時(shí),沒有大括號(hào)保護(hù)容易出錯(cuò)(如果宏定義時(shí)遺漏了大括號(hào))。

    if (objectIsNotExist) { // Good:單行條件語句也加大括號(hào)return CreateNewObject(); }

    規(guī)則2.6 禁止 if/else/else if 寫在同一行

    條件語句中,若有多個(gè)分支,應(yīng)該寫在不同行。

    如下是正確的寫法:

    if (someConditions) {... } else { // Good: else 與 if 在不同行... }

    下面是不符合規(guī)范的案例:

    if (someConditions) { ... } else { ... } // Bad: else 與 if 在同一行

    循環(huán)

    規(guī)則2.7 循環(huán)語句必須使用大括號(hào)

    和條件表達(dá)式類似,我們要求for/while循環(huán)語句必須加上大括號(hào),即便循環(huán)體是空的,或循環(huán)語句只有一條。

    for (int i = 0; i < someRange; i++) { // Good: 使用了大括號(hào)DoSomething(); }while (condition) { } // Good:循環(huán)體是空,使用大括號(hào)while (condition) { continue; // Good:continue 表示空邏輯,使用大括號(hào) }

    壞的例子:

    for (int i = 0; i < someRange; i++)DoSomething(); // Bad: 應(yīng)該加上括號(hào)while (condition); // Bad:使用分號(hào)容易讓人誤解是while語句中的一部分

    switch語句

    規(guī)則2.8 switch 語句的 case/default 要縮進(jìn)一層

    switch 語句的縮進(jìn)風(fēng)格如下:

    switch (var) {case 0: // Good: 縮進(jìn)DoSomething1(); // Good: 縮進(jìn)break;case 1: { // Good: 帶大括號(hào)格式DoSomething2();break;}default:break; }switch (var) { case 0: // Bad: case 未縮進(jìn)DoSomething();break; default: // Bad: default 未縮進(jìn)break; }

    表達(dá)式

    建議2.2 表達(dá)式換行要保持換行的一致性,操作符放行末

    較長的表達(dá)式,不滿足行寬要求的時(shí)候,需要在適當(dāng)?shù)牡胤綋Q行。一般在較低優(yōu)先級(jí)操作符或連接符后面截?cái)?#xff0c;操作符或連接符放在行末。
    操作符、連接符放在行末,表示“未結(jié)束,后續(xù)還有”。

    例:

    // 假設(shè)下面第一行已經(jīng)不滿足行寬要求 if ((currentValue > MIN) && // Good:換行后,布爾操作符放在行末(currentValue < MAX)) { DoSomething();... }int result = reallyReallyLongVariableName1 + // Good: 加號(hào)留在行末reallyReallyLongVariableName2;

    表達(dá)式換行后,注意保持合理對(duì)齊,或者4空格縮進(jìn)。參考下面例子

    int sum = longVaribleName1 + longVaribleName2 + longVaribleName3 +longVaribleName4 + longVaribleName5 + longVaribleName6; // OK: 4空格縮進(jìn)int sum = longVaribleName1 + longVaribleName2 + longVaribleName3 +longVaribleName4 + longVaribleName5 + longVaribleName6; // OK: 保持對(duì)齊

    變量賦值

    規(guī)則2.9 多個(gè)變量定義和賦值語句不允許寫在一行

    每行最好只有一個(gè)變量初始化的語句,更容易閱讀和理解。

    int maxCount = 10; bool isCompleted = false;

    下面是不符合規(guī)范的示例:

    int maxCount = 10; bool isCompleted = false; // Bad:多個(gè)初始化放在了同一行 int x, y = 0; // Bad:多個(gè)變量定義需要分行,每行一個(gè)int pointX; int pointY; ... pointX = 1; pointY = 2; // Bad:多個(gè)變量賦值語句放同一行

    例外情況:
    對(duì)于多個(gè)相關(guān)性強(qiáng)的變量定義,且無需初始化時(shí),可以定義在一行,減少重復(fù)信息,以便代碼更加緊湊。

    int i, j; // Good:多變量定義,未初始化,可以寫在一行 for (i = 0; i < row; i++) {for (j = 0; j < col; j++) {...} }

    初始化

    初始化包括結(jié)構(gòu)體、聯(lián)合體及數(shù)組的初始化

    規(guī)則2.10 初始化換行時(shí)要有縮進(jìn),或進(jìn)行合理對(duì)齊

    結(jié)構(gòu)體或數(shù)組初始化時(shí),如果換行應(yīng)保持4空格縮進(jìn)。
    從可讀性角度出發(fā),選擇換行點(diǎn)和對(duì)齊位置。

    // Good: 滿足行寬要求時(shí)不換行 int arr[4] = { 1, 2, 3, 4 };// Good: 行寬較長時(shí),換行讓可讀性更好 const int rank[] = { 16, 16, 16, 16, 32, 32, 32, 32,64, 64, 64, 64, 32, 32, 32, 32 };

    對(duì)于復(fù)雜結(jié)構(gòu)數(shù)據(jù)的初始化,盡量清晰、緊湊。
    參考如下格式:

    int a[][4] = {{ 1, 2, 3, 4 }, { 2, 2, 3, 4 }, // OK.{ 3, 2, 3, 4 }, { 4, 2, 3, 4 } };int b[][8] = {{ 1, 2, 3, 4, 5, 6, 7, 8 }, // OK.{ 2, 2, 3, 4, 5, 6, 7, 8 } };int c[][8] = {{1, 2, 3, 4, 5, 6, 7, 8 // OK.}, {2, 2, 3, 4, 5, 6, 7, 8} };

    注意:

    • 左大括號(hào)放行末時(shí),對(duì)應(yīng)的右大括號(hào)需另起一行

    • 左大括號(hào)被內(nèi)容跟隨時(shí),對(duì)應(yīng)的右大括號(hào)也應(yīng)跟隨內(nèi)容

    規(guī)則2.11 結(jié)構(gòu)體和聯(lián)合體在按成員初始化時(shí),每個(gè)成員初始化單獨(dú)一行

    C99標(biāo)準(zhǔn)支持結(jié)構(gòu)體和聯(lián)合體按照成員進(jìn)行初始化,標(biāo)準(zhǔn)中叫"指定初始化"(designated initializer)。如果按照這種方式進(jìn)行初始化,每個(gè)成員的初始化單獨(dú)一行。

    struct Date {int year;int month;int day; };struct Date date = { // Good:使用指定初始化方式時(shí),每行初始化一個(gè).year = 2000,.month = 1,.day = 1 };

    指針

    建議2.3 指針類型"*"跟隨變量名或者類型,不要兩邊都留有空格或都沒有空格

    聲明或定義指針變量或者返回指針類型函數(shù)時(shí),"*" 靠左靠右都可以,但是不要兩邊都有或者都沒有空格。

    int *p1; // OK. int* p2; // OK.int*p3; // Bad: 兩邊都沒空格 int * p4; // Bad: 兩邊都有空格

    選擇一種風(fēng)格,并保持一致性。

    選擇"*"跟隨類型風(fēng)格時(shí),避免一行同時(shí)聲明帶指針的多個(gè)變量。

    int* a, b; // Bad: 很容易將 b 誤理解成指針

    選擇"*"跟隨變量風(fēng)格時(shí),可能會(huì)存在無法緊跟的情況。
    無法跟隨時(shí)就不跟隨,不要破壞風(fēng)格一致性。

    char * const VERSION = "V100"; // OK. int Foo(const char * restrict p); // OK.

    注意,任何時(shí)候 "*" 不要緊跟 const 或 restrict 關(guān)鍵字。

    編譯預(yù)處理

    規(guī)則2.12 編譯預(yù)處理的"#"默認(rèn)放在行首,嵌套編譯預(yù)處理語句時(shí),"#"可以進(jìn)行縮進(jìn)

    編譯預(yù)處理的"#"統(tǒng)一放在行首;即便編譯預(yù)處理的代碼是嵌入在函數(shù)體中的,"#"也應(yīng)該放在行首。

    空格和空行

    規(guī)則2.13 水平空格應(yīng)該突出關(guān)鍵字和重要信息,避免不必要的留白

    水平空格應(yīng)該突出關(guān)鍵字和重要信息,每行代碼尾部不要加空格。總體規(guī)則如下:

    • if, switch, case, do, while, for 等關(guān)鍵字之后加空格;

    • 小括號(hào)內(nèi)部的兩側(cè),不要加空格

    • 二元操作符(= + ‐ < > * / % | & ^ <= >= == !=)左右兩側(cè)加空格

    • 一元操作符(& * + ‐ ~ !)之后不要加空格

    • 三目操作符(? :)符號(hào)兩側(cè)均需要空格

    • 結(jié)構(gòu)體中表示位域的冒號(hào),兩側(cè)均需要空格

    • 前置和后置的自增、自減(++ --)和變量之間不加空格

    • 結(jié)構(gòu)體成員操作符(. ->)前后不加空格

    • 大括號(hào)內(nèi)部兩側(cè)有無空格,左右必須保持一致

    • 逗號(hào)、分號(hào)、冒號(hào)(不含三目操作符和表示位域的冒號(hào))緊跟前面內(nèi)容無空格,其后需要空格

    • 函數(shù)參數(shù)列表的小括號(hào)與函數(shù)名之間無空格

    • 類型強(qiáng)制轉(zhuǎn)換的小括號(hào)與被轉(zhuǎn)換對(duì)象之間無空格

    • 數(shù)組的中括號(hào)與數(shù)組名之間無空格

    • 涉及到換行時(shí),行末的空格可以省去

    對(duì)于大括號(hào)內(nèi)部兩側(cè)的空格,建議如下:

    • 一般的,大括號(hào)內(nèi)部兩側(cè)建議加空格

    • 對(duì)于空的,或單個(gè)標(biāo)識(shí)符,或單個(gè)字面常量,空格不是必須 如:'{}', '{0}', '{NULL}', '{"hi"}' 等

    • 連續(xù)嵌套的多重括號(hào)之間,空格不是必須 如:'{{0}}', '{{ 1, 2 }}' 等 錯(cuò)誤示例:'{ 0, {1}}',不屬于連續(xù)嵌套場景,而且最外側(cè)大括號(hào)左右不一致

    常規(guī)情況:

    int i = 0; // Good:變量初始化時(shí),= 前后應(yīng)該有空格,分號(hào)前面不要留空格 int buf[BUF_SIZE] = {0}; // Good:數(shù)組初始化時(shí),大括號(hào)內(nèi)空格可選 int arr[] = { 10, 20 }; // Good: 正常大括號(hào)內(nèi)部兩側(cè)建議加空格

    函數(shù)定義和函數(shù)調(diào)用:

    int result = Foo(arg1,arg2); ^ // Bad: 逗號(hào)后面應(yīng)該有空格int result = Foo( arg1, arg2 );^ ^ // Bad: 小括號(hào)內(nèi)部兩側(cè)不應(yīng)該有空格

    指針和取地址

    x = *p; // Good:*操作符和指針p之間不加空格 p = &x; // Good:&操作符和變量x之間不加空格 x = r.y; // Good:通過.訪問成員變量時(shí)不加空格 x = r->y; // Good:通過->訪問成員變量時(shí)不加空格

    操作符:

    x = 0; // Good:賦值操作的=前后都要加空格 x = -5; // Good:負(fù)數(shù)的符號(hào)和數(shù)值之前不要加空格 ++x; // Good:前置和后置的++/--和變量之間不要加空格 x--;if (x && !y) // Good:布爾操作符前后要加上空格,!操作和變量之間不要空格 v = w * x + y / z; // Good:二元操作符前后要加空格 v = w * (x + z); // Good:括號(hào)內(nèi)的表達(dá)式前后不需要加空格

    循環(huán)和條件語句:

    if (condition) { // Good:if關(guān)鍵字和括號(hào)之間加空格,括號(hào)內(nèi)條件語句前后不加空格... } else { // Good:else關(guān)鍵字和大括號(hào)之間加空格... }while (condition) {} // Good:while關(guān)鍵字和括號(hào)之間加空格,括號(hào)內(nèi)條件語句前后不加空格for (int i = 0; i < someRange; ++i) { // Good:for關(guān)鍵字和括號(hào)之間加空格,分號(hào)之后加空格... }switch (var) { // Good: switch 關(guān)鍵字后面有1空格case 0: // Good:case語句條件和冒號(hào)之間不加空格...break;...default:...break; }

    注意:當(dāng)前的集成開發(fā)環(huán)境(IDE)和代碼編輯器都可以設(shè)置刪除行尾的空格,請(qǐng)正確配置你的編輯器。

    建議2.4 合理安排空行,保持代碼緊湊

    減少不必要的空行,可以顯示更多的代碼,方便代碼閱讀。下面有一些建議遵守的規(guī)則:

    • 根據(jù)上下內(nèi)容的相關(guān)程度,合理安排空行;

    • 函數(shù)內(nèi)部、類型定義內(nèi)部、宏內(nèi)部、初始化表達(dá)式內(nèi)部,不使用連續(xù)空行

    • 不使用連續(xù)?3?個(gè)空行,或更多

    • 大括號(hào)內(nèi)的代碼塊首行之前和末行之后不要加空行。

    ret = DoSomething();if (ret != OK) { // Bad: 返回值判斷應(yīng)該緊跟函數(shù)調(diào)用return -1; }int Foo(void) {... }int Bar(void) // Bad:最多使用連續(xù)2個(gè)空行。 {... }int Foo(void) {DoSomething(); // Bad:大括號(hào)內(nèi)部首尾,不需要空行...}

    3 注釋

    一般的,盡量通過清晰的架構(gòu)邏輯,好的符號(hào)命名來提高代碼可讀性;需要的時(shí)候,才輔以注釋說明。
    注釋是為了幫助閱讀者快速讀懂代碼,所以要從讀者的角度出發(fā),按需注釋

    注釋內(nèi)容要簡潔、明了、無二義性,信息全面且不冗余。

    注釋跟代碼一樣重要。
    寫注釋時(shí)要換位思考,用注釋去表達(dá)此時(shí)讀者真正需要的信息。在代碼的功能、意圖層次上進(jìn)行注釋,即注釋解釋代碼難以表達(dá)的意圖,不要重復(fù)代碼信息。
    修改代碼時(shí),也要保證其相關(guān)注釋的一致性。只改代碼,不改注釋是一種不文明行為,破壞了代碼與注釋的一致性,讓閱讀者迷惑、費(fèi)解,甚至誤解。

    使用英文進(jìn)行注釋。

    注釋風(fēng)格

    在 C 代碼中,使用?/*?*/和?//?都是可以的。
    按注釋的目的和位置,注釋可分為不同的類型,如文件頭注釋、函數(shù)頭注釋、代碼注釋等等;
    同一類型的注釋應(yīng)該保持統(tǒng)一的風(fēng)格。

    注意:本文示例代碼中,大量使用 '//' 后置注釋只是為了更精確的描述問題,并不代表這種注釋風(fēng)格更好。

    文件頭注釋

    規(guī)則3.1 文件頭注釋必須包含版權(quán)許可

    /*

    • Copyright (c) 2020 XXX

    • Licensed under the Apache License, Version 2.0 (the "License");

    • you may not use this file except in compliance with the License.

    • You may obtain a copy of the License at

    • http://www.apache.org/licenses/LICENSE-2.0
    • Unless required by applicable law or agreed to in writing, software

    • distributed under the License is distributed on an "AS IS" BASIS,

    • WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.

    • See the License for the specific language governing permissions and

    • limitations under the License. */

    函數(shù)頭注釋

    規(guī)則3.2 禁止空有格式的函數(shù)頭注釋

    并不是所有的函數(shù)都需要函數(shù)頭注釋;
    函數(shù)原型無法表達(dá)的信息,加函數(shù)頭注釋輔助說明;

    函數(shù)頭注釋統(tǒng)一放在函數(shù)聲明或定義上方。
    選擇使用如下風(fēng)格之一:
    使用'//'寫函數(shù)頭

    // 單行函數(shù)頭 int Func1(void);// 多行函數(shù)頭 // 第二行 int Func2(void);

    使用'/*' '*/' 寫函數(shù)頭

    /* 單行函數(shù)頭 */ int Func1(void);/** 單行或多行函數(shù)頭* 第二行*/ int Func2(void);

    函數(shù)盡量通過函數(shù)名自注釋,按需寫函數(shù)頭注釋。
    不要寫無用、信息冗余的函數(shù)頭;不要寫空有格式的函數(shù)頭。

    函數(shù)頭注釋內(nèi)容可選,但不限于:功能說明、返回值,性能約束、用法、內(nèi)存約定、算法實(shí)現(xiàn)、可重入的要求等等。
    模塊對(duì)外頭文件中的函數(shù)接口聲明,其函數(shù)頭注釋,應(yīng)當(dāng)將重要、有用的信息表達(dá)清楚。

    例:

    /** 返回實(shí)際寫入的字節(jié)數(shù),-1表示寫入失敗* 注意,內(nèi)存 buf 由調(diào)用者負(fù)責(zé)釋放*/ int WriteString(char *buf, int len);

    壞的例子:

    /** 函數(shù)名:WriteString* 功能:寫入字符串* 參數(shù):* 返回值:*/ int WriteString(char *buf, int len);

    上面例子中的問題:

    • 參數(shù)、返回值,空有格式?jīng)]內(nèi)容

    • 函數(shù)名信息冗余

    • 關(guān)鍵的 buf 由誰釋放沒有說清楚

    代碼注釋

    規(guī)則3.3 代碼注釋放于對(duì)應(yīng)代碼的上方或右邊

    規(guī)則3.4 注釋符與注釋內(nèi)容間要有1空格;右置注釋與前面代碼至少1空格

    代碼上方的注釋,應(yīng)該保持對(duì)應(yīng)代碼一樣的縮進(jìn)。
    選擇并統(tǒng)一使用如下風(fēng)格之一:
    使用'//'

    // 這是單行注釋 DoSomething();// 這是多行注釋 // 第二行 DoSomething();

    使用'/*' '*/'

    /* 這是單行注釋 */ DoSomething();/** 這是單/多行注釋* 第二行*/ DoSomething();

    代碼右邊的注釋,與代碼之間,至少留1空格,建議不超過4空格。
    通常使用擴(kuò)展后的 TAB 鍵即可實(shí)現(xiàn) 1-4 空格的縮進(jìn)。

    選擇并統(tǒng)一使用如下風(fēng)格之一:

    int foo = 100; // 放右邊的注釋 int bar = 200; /* 放右邊的注釋 */

    右置格式在適當(dāng)?shù)臅r(shí)候,上下對(duì)齊會(huì)更美觀。
    對(duì)齊后的注釋,離左邊代碼最近的那一行,保證1-4空格的間隔。
    例:

    #define A_CONST 100 /* 相關(guān)的同類注釋,可以考慮上下對(duì)齊 */ #define ANOTHER_CONST 200 /* 上下對(duì)齊時(shí),與左側(cè)代碼保持間隔 */

    當(dāng)右置的注釋超過行寬時(shí),請(qǐng)考慮將注釋置于代碼上方。

    規(guī)則3.5 不用的代碼段直接刪除,不要注釋掉

    被注釋掉的代碼,無法被正常維護(hù);當(dāng)企圖恢復(fù)使用這段代碼時(shí),極有可能引入易被忽略的缺陷。
    正確的做法是,不需要的代碼直接刪除掉。若再需要時(shí),考慮移植或重寫這段代碼。

    這里說的注釋掉代碼,包括用 /* */ 和 //,還包括 #if 0, #ifdef NEVER_DEFINED 等等。

    建議3.1 case語句塊結(jié)束時(shí)如果不加break/return,需要有注釋說明(fall-through)

    有時(shí)候需要對(duì)多個(gè)case標(biāo)簽做相同的事情,case語句在結(jié)束不加break或return,直接執(zhí)行下一個(gè)case標(biāo)簽中的語句,這在C語法中稱之為"fall-through"。
    這種情況下,需要在"fall-through"的地方加上注釋,清晰明確的表達(dá)出這樣做的意圖;或者至少顯式指明是 "fall-through"。

    例,顯式指明 fall-through:

    switch (var) {case 0:DoSomething();/* fall-through */case 1:DoSomeOtherThing();...break;default: DoNothing();break; }

    如果 case 語句是空語句,則可以不用加注釋特別說明:

    switch (var) {case 0:case 1:DoSomething();break;default:DoNothing();break; }

    4 頭文件

    對(duì)于C語言來說,頭文件的設(shè)計(jì)體現(xiàn)了大部分的系統(tǒng)設(shè)計(jì)
    正確使用頭文件可使代碼在可讀性、文件大小和編譯構(gòu)建性能上大為改觀。

    本章從編程規(guī)范的角度總結(jié)了一些方法,可用于幫助合理規(guī)劃頭文件。

    頭文件職責(zé)

    頭文件是模塊或文件的對(duì)外接口。
    頭文件中適合放置接口的聲明,不適合放置實(shí)現(xiàn)(內(nèi)聯(lián)函數(shù)除外)。
    頭文件應(yīng)當(dāng)職責(zé)單一。頭文件過于復(fù)雜,依賴過于復(fù)雜還是導(dǎo)致編譯時(shí)間過長的主要原因。

    建議4.1 每一個(gè).c文件都應(yīng)該有相應(yīng)的.h文件,用于聲明需要對(duì)外公開的接口

    通常情況下,每個(gè).c文件都有一個(gè)相應(yīng)的.h(并不一定同名),用于放置對(duì)外提供的函數(shù)聲明、宏定義、類型定義等。
    如果一個(gè).c文件不需要對(duì)外公布任何接口,則其就不應(yīng)當(dāng)存在。

    例外:程序的入口(如main函數(shù)所在的文件),單元測試代碼,動(dòng)態(tài)庫代碼。

    示例:
    foo.h 內(nèi)容

    #ifndef FOO_H #define FOO_Hint Foo(void); // Good:頭文件中聲明對(duì)外接口#endif

    foo.c 內(nèi)容

    static void Bar(void); // Good: 對(duì)內(nèi)函數(shù)的聲明放在.c文件的頭部,并聲明為static限制其作用域void Foo(void) {Bar(); }static void Bar(void) {// Do something; }

    內(nèi)部使用的函數(shù)聲明,宏、枚舉、結(jié)構(gòu)體等定義不應(yīng)放在頭文件中。

    有些產(chǎn)品中,習(xí)慣一個(gè).c文件對(duì)應(yīng)兩個(gè).h文件,一個(gè)用于存放對(duì)外公開的接口,一個(gè)用于存放內(nèi)部需要用到的定義、聲明等,以控制.c文件的代碼行數(shù)。
    不提倡這種風(fēng)格,產(chǎn)生這種風(fēng)格的根源在于.c過大,應(yīng)當(dāng)首先考慮拆分.c文件。
    另外,一旦把私有定義、聲明放到獨(dú)立的頭文件中,就無法從技術(shù)上避免別人包含。

    本規(guī)則反過來并不一定成立。比如:
    有些特別簡單的頭文件,如命令 ID 定義頭文件,不需要有對(duì)應(yīng)的.c存在。
    同一套接口協(xié)議下,有多個(gè)實(shí)例,由于接口相同且穩(wěn)定,所以允許出現(xiàn)一個(gè).h對(duì)應(yīng)多個(gè).c文件。

    建議4.2 頭文件的擴(kuò)展名只使用.h,不使用非習(xí)慣用法的擴(kuò)展名,如.inc

    有些產(chǎn)品中使用了 .inc 作為頭文件擴(kuò)展名,這不符合C語言的習(xí)慣用法。在使用 .inc 作為頭文件擴(kuò)展名的產(chǎn)品,習(xí)慣上用于標(biāo)識(shí)此頭文件為私有頭文件。但是從產(chǎn)品的實(shí)際代碼來看,這一條并沒有被遵守,一個(gè) .inc 文件被多個(gè) .c 包含。本規(guī)范不提倡將私有定義單獨(dú)放在頭文件中,具體見建議4.1。

    頭文件依賴

    頭文件包含是一種依賴關(guān)系,頭文件應(yīng)向穩(wěn)定的方向包含。
    一般來說,應(yīng)當(dāng)讓不穩(wěn)定的模塊依賴穩(wěn)定的模塊,從而當(dāng)不穩(wěn)定的模塊發(fā)生變化時(shí),不會(huì)影響(編譯)穩(wěn)定的模塊。

    依賴的方向應(yīng)該是:產(chǎn)品依賴于平臺(tái),平臺(tái)依賴于標(biāo)準(zhǔn)庫。

    除了不穩(wěn)定的模塊依賴于穩(wěn)定的模塊外,更好的方式是每個(gè)模塊都依賴于接口,這樣任何一個(gè)模塊的內(nèi)部實(shí)現(xiàn)更改都不需要重新編譯另外一個(gè)模塊。
    在這里,假設(shè)接口本身是最穩(wěn)定的。

    規(guī)則4.1 禁止頭文件循環(huán)依賴

    頭文件循環(huán)依賴,指 a.h 包含 b.h,b.h 包含 c.h,c.h 包含 a.h, 導(dǎo)致任何一個(gè)頭文件修改,都導(dǎo)致所有包含了a.h/b.h/c.h的代碼全部重新編譯一遍。
    而如果是單向依賴,如a.h包含b.h,b.h包含c.h,而c.h不包含任何頭文件,則修改a.h不會(huì)導(dǎo)致包含了b.h/c.h的源代碼重新編譯。

    頭文件循環(huán)依賴直接體現(xiàn)了架構(gòu)設(shè)計(jì)上的不合理,可通過架構(gòu)優(yōu)化來避免。

    規(guī)則4.2 頭文件必須編寫#define保護(hù),防止重復(fù)包含

    為防止頭文件被多重包含,所有頭文件都應(yīng)當(dāng)使用 #define 作為包含保護(hù);不要使用 #pragma once

    定義包含保護(hù)符時(shí),應(yīng)該遵守如下規(guī)則:

    • 保護(hù)符使用唯一名稱;建議考慮項(xiàng)目源代碼樹頂層以下的文件路徑

    • 不要在受保護(hù)部分的前后放置代碼或者注釋,文件頭注釋除外。

    假定 timer 模塊的 timer.h,其目錄為?timer/include/timer.h。其保護(hù)符若使用 'TIME_H' 很容易不唯一,所以使用項(xiàng)目源代碼樹的全路徑,如:

    #ifndef TIMER_INCLUDE_TIMER_H #define TIMER_INCLUDE_TIMER_H...#endif

    規(guī)則4.3 禁止通過聲明的方式引用外部函數(shù)接口、變量

    只能通過包含頭文件的方式使用其他模塊或文件提供的接口。
    通過 extern 聲明的方式使用外部函數(shù)接口、變量,容易在外部接口改變時(shí)可能導(dǎo)致聲明和定義不一致。
    同時(shí)這種隱式依賴,容易導(dǎo)致架構(gòu)腐化。

    不符合規(guī)范的案例:
    a.c 內(nèi)容

    extern int Foo(void); // Bad: 通過 extern 的方式引用外部函數(shù)void Bar(void) {int i = Foo(); // 這里使用了外部接口 Foo... }

    應(yīng)該改為:
    a.c 內(nèi)容

    #include "b.h" // Good: 通過包含頭文件的方式使用其他.c提供的接口void Bar(void) {int i = Foo();... }

    b.h 內(nèi)容

    int Foo(void);

    b.c內(nèi)容

    int Foo(void) {// Do something }

    例外,有些場景需要引用其內(nèi)部函數(shù),但并不想侵入代碼時(shí),可以 extern 聲明方式引用。
    如:
    針對(duì)某一內(nèi)部函數(shù)進(jìn)行單元測試時(shí),可以通過 extern 聲明來引用被測函數(shù);
    當(dāng)需要對(duì)某一函數(shù)進(jìn)行打樁、打補(bǔ)丁處理時(shí),允許 extern 聲明該函數(shù)。

    規(guī)則4.4 禁止在 extern "C" 中包含頭文件

    在 extern "C" 中包含頭文件,有可能會(huì)導(dǎo)致 extern "C" 嵌套,部分編譯器對(duì) extern "C" 嵌套層次有限制,嵌套層次太多會(huì)編譯錯(cuò)誤。

    extern "C" 通常出現(xiàn)在 C,C++ 混合編程的情況下,在 extern "C" 中包含頭文件,可能會(huì)導(dǎo)致被包含頭文件的原有意圖遭到破壞,比如鏈接規(guī)范被不正確地更改。

    示例,存在a.h和b.h兩個(gè)頭文件:
    a.h 內(nèi)容

    ... #ifdef __cplusplus void Foo(int); #define A(value) Foo(value) #else void A(int) #endif

    b.h 內(nèi)容

    ... #ifdef __cplusplus extern "C" { #endif#include "a.h" void B(void);#ifdef __cplusplus } #endif

    使用C++預(yù)處理器展開b.h,將會(huì)得到

    extern "C" {void Foo(int);void B(void); }

    按照 a.h 作者的本意,函數(shù) Foo 是一個(gè) C++ 自由函數(shù),其鏈接規(guī)范為 "C++"。但在 b.h 中,由于?#include "a.h"?被放到了?extern "C"?的內(nèi)部,函數(shù) Foo 的鏈接規(guī)范被不正確地更改了。

    例外:如果在 C++ 編譯環(huán)境中,想引用純C的頭文件,這些C頭文件并沒有?extern "C"?修飾。非侵入式的做法是,在?extern "C"?中去包含C頭文件。

    5 函數(shù)

    函數(shù)的作用:避免重復(fù)代碼、增加可重用性;分層,降低復(fù)雜度、隱藏實(shí)現(xiàn)細(xì)節(jié),使程序更加模塊化,從而更有利于程序的閱讀,維護(hù)。

    函數(shù)應(yīng)該簡潔、短小。
    一個(gè)函數(shù)只完成一件事情。

    函數(shù)設(shè)計(jì)

    函數(shù)設(shè)計(jì)的精髓:編寫整潔函數(shù),同時(shí)把代碼有效組織起來。代碼簡單直接、不隱藏設(shè)計(jì)者的意圖、用干凈利落的抽象和直截了當(dāng)?shù)目刂普Z句將函數(shù)有機(jī)組織起來。

    規(guī)則5.1 避免函數(shù)過長,函數(shù)不超過50行(非空非注釋)

    函數(shù)應(yīng)該可以一屏顯示完 (50行以內(nèi)),只做一件事情,而且把它做好。

    過長的函數(shù)往往意味著函數(shù)功能不單一,過于復(fù)雜,或過分呈現(xiàn)細(xì)節(jié),未進(jìn)行進(jìn)一步抽象。

    例外:
    考慮代碼的聚合性與功能的全面性,某些函數(shù)可能會(huì)超過50行,但前提是不影響代碼的可讀性與簡潔。
    這些例外的函數(shù)應(yīng)該是極少的,例如特定算法處理。

    即使一個(gè)長函數(shù)現(xiàn)在工作的非常好, 一旦有人對(duì)其修改, 有可能出現(xiàn)新的問題, 甚至導(dǎo)致難以發(fā)現(xiàn)的bug。
    建議將其拆分為更加簡短并易于管理的若干函數(shù),以便于他人閱讀和修改代碼。

    規(guī)則5.2 避免函數(shù)的代碼塊嵌套過深,不要超過4層

    函數(shù)的代碼塊嵌套深度指的是函數(shù)中的代碼控制塊(例如:if、for、while、switch等)之間互相包含的深度。
    每級(jí)嵌套都會(huì)增加閱讀代碼時(shí)的腦力消耗,因?yàn)樾枰谀X子里維護(hù)一個(gè)“棧”(比如,進(jìn)入條件語句、進(jìn)入循環(huán)等等)。
    應(yīng)該做進(jìn)一步的功能分解,從而避免使代碼的閱讀者一次記住太多的上下文。

    使用衛(wèi)語句可以有效的減少 if 相關(guān)的嵌套層次。例:
    原代碼嵌套層數(shù)是 3:

    int Foo(...) {if (received) {type = GetMsgType(msg);if (type != UNKNOWN) {return DealMsg(...);}}return -1; }

    使用衛(wèi)語句重構(gòu),嵌套層數(shù)變成 2:

    int Foo(...) {if (!received) { // Good: 使用'衛(wèi)語句'return -1;}type = GetMsgType(msg);if (type == UNKNOWN) {return -1;}return DealMsg(..); }

    例外:
    考慮代碼的聚合性與功能的全面性,某些函數(shù)嵌套可能會(huì)超過4層,但前提是不影響代碼的可讀性與簡潔。
    這些例外的函數(shù)應(yīng)該是極少的。

    建議5.1 對(duì)函數(shù)的錯(cuò)誤返回碼要全面處理

    一個(gè)函數(shù)(標(biāo)準(zhǔn)庫中的函數(shù)/第三方庫函數(shù)/用戶定義的函數(shù))能夠提供一些指示錯(cuò)誤發(fā)生的方法。這可以通過使用錯(cuò)誤標(biāo)記、特殊的返回?cái)?shù)據(jù)或者其他手段,不管什么時(shí)候函數(shù)提供了這樣的機(jī)制,調(diào)用程序應(yīng)該在函數(shù)返回時(shí)立刻檢查錯(cuò)誤指示。

    示例:

    char fileHead[128]; ReadFileHead(fileName, fileHead, sizeof(fileHead)); // Bad: 未檢查返回值DealWithFileHead(fileHead, sizeof(fileHead)); // fileHead 可能無效

    正確寫法:

    char fileHead[128]; ret = ReadFileHead(fileName, fileHead, sizeof(fileHead)); if (ret != OK) { // Good: 確保 fileHead 被有效寫入return ERROR; }DealWithFileHead(fileHead, sizeof(fileHead)); // 處理文件頭

    注意,當(dāng)函數(shù)返回值被大量的顯式(void)忽略掉時(shí),應(yīng)當(dāng)考慮函數(shù)返回值的設(shè)計(jì)是否合理。
    如果所有調(diào)用者都不關(guān)注函數(shù)返回值時(shí),請(qǐng)將函數(shù)設(shè)計(jì)成void型。

    函數(shù)參數(shù)

    建議5.2 設(shè)計(jì)函數(shù)時(shí),優(yōu)先使用返回值而不是輸出參數(shù)

    使用返回值而不是輸出參數(shù),可以提高可讀性,并且通常提供相同或更好的性能。

    函數(shù)名為 GetXxx、FindXxx 或直接名詞作函數(shù)名的函數(shù),直接返回對(duì)應(yīng)對(duì)象,可讀性更好。

    建議5.3 使用強(qiáng)類型參數(shù),避免使用void*

    盡管不同的語言對(duì)待強(qiáng)類型和弱類型有自己的觀點(diǎn),但是一般認(rèn)為c/c++是強(qiáng)類型語言,既然我們使用的語言是強(qiáng)類型的,就應(yīng)該保持這樣的風(fēng)格。
    好處是盡量讓編譯器在編譯階段就檢查出類型不匹配的問題。

    使用強(qiáng)類型便于編譯器幫我們發(fā)現(xiàn)錯(cuò)誤,如下代碼中注意函數(shù)?FooListAddNode?的使用:

    struct FooNode {struct List link;int foo; };struct BarNode {struct List link;int bar; }void FooListAddNode(void *node) // Bad: 這里用 void * 類型傳遞參數(shù) {FooNode *foo = (FooNode *)node;ListAppend(&g_fooList, &foo->link); }void MakeTheList(...) {FooNode *foo;BarNode *bar;...FooListAddNode(bar); // Wrong: 這里本意是想傳遞參數(shù) foo,但錯(cuò)傳了 bar,卻沒有報(bào)錯(cuò) }

    上述問題有可能很隱晦,不易輕易暴露,從而破壞性更大。
    如果明確?FooListAddNode?的參數(shù)類型,而不是?void *,則在編譯階段就能發(fā)現(xiàn)上述問題。

    void FooListAddNode(FooNode *foo) {ListAppend(&g_fooList, &foo->link); }

    例外:某些通用泛型接口,需要傳入不同類型指針的,可以用?void *?入?yún)ⅰ?/p>

    建議5.4 模塊內(nèi)部函數(shù)參數(shù)的合法性檢查,由調(diào)用者負(fù)責(zé)

    對(duì)于模塊外部傳入的參數(shù),必須進(jìn)行合法性檢查,保護(hù)程序免遭非法輸入數(shù)據(jù)的破壞。
    模塊內(nèi)部函數(shù)調(diào)用,缺省由調(diào)用者負(fù)責(zé)保證參數(shù)的合法性,如果都由被調(diào)用者來檢查參數(shù)合法性,可能會(huì)出現(xiàn)同一個(gè)參數(shù),被檢查多次,產(chǎn)生冗余代碼,很不簡潔。

    由調(diào)用者保證入?yún)⒌暮戏ㄐ?#xff0c;這種契約式編程能讓代碼邏輯更簡潔,可讀性更好。
    示例:

    int SomeProc(...) {int data;bool dataOK = GetData(&data); // 獲取數(shù)據(jù)if (!dataOK) { // 檢查上一步結(jié)果,其實(shí)也就保證了數(shù)據(jù)合法return -1;}DealWithData(data); // 調(diào)用數(shù)據(jù)處理函數(shù)... }void DealWithData(int data) {if (data < MIN || data > MAX) { // Bad: 調(diào)用者已經(jīng)保證了數(shù)據(jù)合法性return;}... }

    建議5.5 函數(shù)的指針參數(shù)如果不是用于修改所指向的對(duì)象就應(yīng)該聲明為指向const的指針

    const 指針參數(shù),將限制函數(shù)通過該指針修改所指向?qū)ο?#xff0c;使代碼更牢固、安全。

    示例:C99標(biāo)準(zhǔn) 7.21.4.4 中strncmp 的例子,不變參數(shù)聲明為const。

    int strncmp(const char *s1, const char *s2, size_t n); // Good:不變參數(shù)聲明為const

    注意:指針參數(shù)要不要加 const 取決于函數(shù)設(shè)計(jì),而不是看函數(shù)實(shí)體內(nèi)有沒有發(fā)生“修改對(duì)象”的動(dòng)作。

    建議5.6 函數(shù)的參數(shù)個(gè)數(shù)不超過5個(gè)

    函數(shù)的參數(shù)過多,會(huì)使得該函數(shù)易于受外部(其他部分的代碼)變化的影響,從而影響維護(hù)工作。函數(shù)的參數(shù)過多同時(shí)也會(huì)增大測試的工作量。

    函數(shù)的參數(shù)個(gè)數(shù)不要超過5個(gè),如果超過可以考慮:

    • 看能否拆分函數(shù)

    • 看能否將相關(guān)參數(shù)合在一起,定義結(jié)構(gòu)體

    內(nèi)聯(lián)函數(shù)

    內(nèi)聯(lián)函數(shù)是C99引入的一種函數(shù)優(yōu)化手段。函數(shù)內(nèi)聯(lián)能消除函數(shù)調(diào)用的開銷;并得益于內(nèi)聯(lián)實(shí)現(xiàn)跟調(diào)用點(diǎn)代碼的合并,編譯器有更大的視角,從而完成更多的代碼優(yōu)化。內(nèi)聯(lián)函數(shù)跟函數(shù)式宏比較類似,兩者的分析詳見建議6.1。

    建議5.7 內(nèi)聯(lián)函數(shù)不超過10行(非空非注釋)

    將函數(shù)定義成內(nèi)聯(lián)一般希望提升性能,但是實(shí)際并不一定能提升性能。如果函數(shù)體短小,則函數(shù)內(nèi)聯(lián)可以有效的縮減目標(biāo)代碼的大小,并提升函數(shù)執(zhí)行效率。
    反之,函數(shù)體比較大,內(nèi)聯(lián)展開會(huì)導(dǎo)致目標(biāo)代碼的膨脹,特別是當(dāng)調(diào)用點(diǎn)很多時(shí),膨脹得更厲害,反而會(huì)降低執(zhí)行效率。
    內(nèi)聯(lián)函數(shù)規(guī)模建議控制在?10?行以內(nèi)。

    不要為了提高性能而濫用內(nèi)聯(lián)函數(shù)。不要過早優(yōu)化。一般情況,當(dāng)有實(shí)際測試數(shù)據(jù)證明內(nèi)聯(lián)性能更高時(shí),再將函數(shù)定義為內(nèi)聯(lián)。對(duì)于類似 setter/getter 短小而且調(diào)用頻繁的函數(shù),可以定義為內(nèi)聯(lián)。

    規(guī)則5.3 被多個(gè)源文件調(diào)用的內(nèi)聯(lián)函數(shù)要放在頭文件中定義

    內(nèi)聯(lián)函數(shù)是在編譯時(shí)內(nèi)聯(lián)展開,因此要求內(nèi)聯(lián)函數(shù)定義必須在調(diào)用此函數(shù)的每個(gè)源文件內(nèi)可見。
    如下所示代碼,inline.h 只有SomeInlineFunc函數(shù)的聲明而沒有定義。other.c包含inline.h,調(diào)用SomeInlineFunc時(shí)無法內(nèi)聯(lián)。

    inline.h

    inline int SomeInlineFunc(void);

    inline.c

    inline int SomeInlineFunc(void) {// 實(shí)現(xiàn)代碼 }

    other.c

    #include "inline.h" int OtherFunc(void) {int ret = SomeInlineFunc(); }

    由于這個(gè)限制,多個(gè)源文件如果要調(diào)用同一個(gè)內(nèi)聯(lián)函數(shù),需要將內(nèi)聯(lián)函數(shù)的定義放在頭文件中。
    gnu89?在內(nèi)聯(lián)函數(shù)實(shí)現(xiàn)上跟C99標(biāo)準(zhǔn)有差異,兼容做法是將函數(shù)聲明為?static inline

    6 宏

    函數(shù)式宏(function-like macro)

    函數(shù)式宏是指形如函數(shù)的宏(示例代碼如下所示),其包含若干條語句來實(shí)現(xiàn)某一特定功能。

    #define ASSERT(x) do { \if (!(x)) { \printk(KERN_EMERG "assertion failed %s: %d: %s\n", \__FILE__, __LINE__, #x); \BUG(); \} \ } while (0)

    建議6.1 使用函數(shù)代替函數(shù)式宏

    定義函數(shù)式宏前,應(yīng)考慮能否用函數(shù)替代。對(duì)于可替代場景,建議用函數(shù)替代宏。
    函數(shù)式宏的缺點(diǎn)如下:

    • 函數(shù)式宏缺乏類型檢查,不如函數(shù)調(diào)用檢查嚴(yán)格。示例代碼見下。

    • 宏展開時(shí)宏參數(shù)不求值,可能會(huì)產(chǎn)生非預(yù)期結(jié)果,詳見規(guī)則6.1和規(guī)則6.3。

    • 宏沒有獨(dú)立的作用域,跟控制流語句配合時(shí),可能會(huì)產(chǎn)生如規(guī)則6.2描述的非預(yù)期結(jié)果。

    • 宏的技巧性太強(qiáng)(參見下面的規(guī)則),例如#的用法和無處不在的括號(hào),影響可讀性。

    • 在特定場景下必須用特定編譯器對(duì)宏的擴(kuò)展,如?gcc?的?statement expression,可移植性也不好。

    • 宏在預(yù)編譯階段展開后,在其后編譯、鏈接和調(diào)試時(shí)都不可見;而且包含多行的宏會(huì)展開為一行。函數(shù)式宏難以調(diào)試、難以打斷點(diǎn),不利于定位問題。

    • 對(duì)于包含大量語句的宏,在每個(gè)調(diào)用點(diǎn)都要展開。如果調(diào)用點(diǎn)很多,會(huì)造成代碼空間的膨脹。

    函數(shù)式宏缺乏類型檢查的示例代碼:

    #define MAX(a, b) (((a) < (b)) ? (b) : (a))int Max(int a, int b) {return (a < b) ? b : a; }int TestMacro(void) {unsigned int a = 1;int b = -1;(void)printf("MACRO: max of a(%u) and b(%d) is %d\n", a, b, MAX(a, b));(void)printf("FUNC : max of a(%u) and b(%d) is %d\n", a, b, Max(a, b));return 0; }

    由于宏缺乏類型檢查,MAX中的a和b的比較提升為無符號(hào)數(shù)的比較,結(jié)果是a < b。輸出結(jié)果是:

    MACRO: max of a(1) and b(-1) is -1 FUNC : max of a(1) and b(-1) is 1

    函數(shù)沒有宏的上述缺點(diǎn)。但是,函數(shù)相比宏,最大的劣勢(shì)是執(zhí)行效率不高(增加函數(shù)調(diào)用的開銷和編譯器優(yōu)化的難度)。
    為此,C99標(biāo)準(zhǔn)引入了內(nèi)聯(lián)函數(shù)(gcc在標(biāo)準(zhǔn)之前就引入了內(nèi)聯(lián)函數(shù))。

    內(nèi)聯(lián)函數(shù)跟宏類似,也是在調(diào)用點(diǎn)展開。不同之處在于內(nèi)聯(lián)函數(shù)是在編譯時(shí)展開。
    內(nèi)聯(lián)函數(shù)兼具函數(shù)和宏的優(yōu)點(diǎn):

    • 內(nèi)聯(lián)函數(shù)/函數(shù)執(zhí)行嚴(yán)格的類型檢查

    • 內(nèi)聯(lián)函數(shù)/函數(shù)的入?yún)⑶笾抵粫?huì)進(jìn)行一次

    • 內(nèi)聯(lián)函數(shù)就地展開,沒有函數(shù)調(diào)用的開銷

    • 內(nèi)聯(lián)函數(shù)比函數(shù)優(yōu)化得更好

    對(duì)于性能敏感的代碼,可以考慮用內(nèi)聯(lián)函數(shù)代替函數(shù)式宏。
    函數(shù)和內(nèi)聯(lián)函數(shù)不能完全替代函數(shù)式宏,函數(shù)式宏在某些場景更適合。
    比如,在日志記錄場景下,使用帶可變參和默認(rèn)參數(shù)的函數(shù)式宏更方便:

    int ErrLog(const char *file, unsigned long line, const char *fmt, ...); #define ERR_LOG(fmt, ...) ErrLog(__FILE__, __LINE__, fmt, ##__VA_ARGS__)

    規(guī)則6.1 定義宏時(shí),宏參數(shù)要使用完備的括號(hào)

    宏參數(shù)在宏展開時(shí)只是文本替換,在編譯時(shí)再求值。文本替換后,宏包含的語句跟調(diào)用點(diǎn)代碼合并。
    合并后的表達(dá)式因?yàn)椴僮鞣膬?yōu)先級(jí)和結(jié)合律,可能會(huì)導(dǎo)致計(jì)算結(jié)果跟期望的不同,尤其是當(dāng)宏參數(shù)在一個(gè)表達(dá)式中時(shí)。

    如下所示,是一種錯(cuò)誤的寫法:

    #define SUM(a, b) a + b // Bad.

    下面這樣調(diào)用宏,執(zhí)行結(jié)果跟預(yù)期不符:
    100 / SUM(2, 8)?將擴(kuò)展成?(100 / 2) + 8,預(yù)期結(jié)果則是100 / (2 + 8)。
    這個(gè)問題可以通過將整個(gè)表示式加上括號(hào)來解決,如下所示:

    #define SUM(a, b) (a + b) // Bad.

    但是這種改法在下面這種場景又有問題:
    SUM(1 << 2, 8)擴(kuò)展成1 << (2 + 8)(因?yàn)?lt;<優(yōu)先級(jí)低于+),跟預(yù)期結(jié)果(1 << 2) + 8不符。

    這個(gè)問題可以通過將每個(gè)宏參數(shù)都加上括號(hào)來解決,如下所示:

    #define SUM(a, b) (a) + (b) // Bad.

    再看看第三種問題場景:SUM(2, 8) * 10?。擴(kuò)展后的結(jié)果為?(2) + ((8) * 10),跟預(yù)期結(jié)果(2 + 8) * 10不符。

    綜上所述,正確的寫法如下:

    #define SUM(a, b) ((a) + (b)) // Good.

    但是要避免濫用括號(hào)。如下所示,單獨(dú)的數(shù)字或標(biāo)識(shí)符加括號(hào)毫無意義。

    #define SOME_CONST 100 // Good: 單獨(dú)的數(shù)字無需括號(hào) #define ANOTHER_CONST (-1) // Good: 負(fù)數(shù)需要使用括號(hào)#define THE_CONST SOME_CONST // Good: 單獨(dú)的標(biāo)識(shí)符無需括號(hào)

    下列情況需要注意:

    • 宏參數(shù)參與 '#', '##' 操作時(shí),不要加括號(hào)

    • 宏參數(shù)參與字符串拼接時(shí),不要加括號(hào)

    • 宏參數(shù)作為獨(dú)立部分,在賦值(包括+=, -=等)操作的某一邊時(shí),無需括號(hào)

    • 宏參數(shù)作為獨(dú)立部分,在逗號(hào)表達(dá)式,函數(shù)或宏調(diào)用列表中,無需括號(hào)

    舉例:

    #define MAKE_STR(x) #x // x 不要加括號(hào)#define HELLO_STR(obj) "Hello, " obj // obj 不要加括號(hào)#define ADD_3(sum, a, b, c) (sum = (a) + (b) + (c)) // a, b, c 需要括號(hào);而 sum 無需括號(hào)#define FOO(a, b) Bar((a) + 1, b) // a 需要括號(hào);而 b 無需括號(hào)

    規(guī)則6.2 包含多條語句的函數(shù)式宏的實(shí)現(xiàn)語句必須放在 do-while(0) 中

    宏本身沒有代碼塊的概念。當(dāng)宏在調(diào)用點(diǎn)展開后,宏內(nèi)定義的表達(dá)式和變量融合到調(diào)用代碼中,可能會(huì)出現(xiàn)變量名沖突和宏內(nèi)語句被分割等問題。通過 do-while(0) 顯式為宏加上邊界,讓宏有獨(dú)立的作用域,并且跟分號(hào)能更好的結(jié)合而形成單條語句,從而規(guī)避此類問題。

    如下所示的宏是錯(cuò)誤的用法(為了說明問題,下面示例代碼稍不符規(guī)范):

    // Not Good. #define FOO(x) \(void)printf("arg is %d\n", (x)); \DoSomething((x));

    當(dāng)像下面示例代碼這樣調(diào)用宏,for循環(huán)只執(zhí)行了宏的第一條語句,宏的后一條語句只在循環(huán)結(jié)束后執(zhí)行一次。

    for (i = 1; i < 10; i++)FOO(i);

    用大括號(hào)將FOO定義的語句括起來可以解決上面的問題:

    #define FOO(x) { \(void)printf("arg is %d\n", (x)); \DoSomething((x)); \ }

    由于大括號(hào)跟分號(hào)沒有關(guān)聯(lián)。大括號(hào)后緊跟的分號(hào),是另外一個(gè)語句。
    如下示例代碼,會(huì)出現(xiàn)'懸掛else' 編譯報(bào)錯(cuò):

    if (condition)FOO(10); elseFOO(20);

    正確的寫法是用 do-while(0) 把執(zhí)行體括起來,如下所示:

    // Good. #define FOO(x) do { \(void)printf("arg is %d\n", (x)); \DoSomething((x)); \ } while (0)

    例外:

    • 包含 break, continue 語句的宏可以例外。使用此類宏務(wù)必特別小心。

    • 宏中包含不完整語句時(shí),可以例外。比如用宏封裝 for 循環(huán)的條件部分。

    • 非多條語句,或單個(gè) if/for/while/switch 語句,可以例外。

    規(guī)則6.3 不允許把帶副作用的表達(dá)式作為參數(shù)傳遞給函數(shù)式宏

    由于宏只是文本替換,對(duì)于內(nèi)部多次使用同一個(gè)宏參數(shù)的函數(shù)式宏,將帶副作用的表達(dá)式作為宏參數(shù)傳入會(huì)導(dǎo)致非預(yù)期的結(jié)果。
    如下所示,宏SQUARE本身沒有問題,但是使用時(shí)將帶副作用的a++傳入導(dǎo)致a的值在SQUARE執(zhí)行后跟預(yù)期不符:

    #define SQUARE(a) ((a) * (a))int a = 5; int b; b = SQUARE(a++); // Bad: 實(shí)際 a 自增加了 2 次

    SQUARE(a++)展開后為((a++) * (a++)),變量a自增了兩次,其值為7,而不是預(yù)期的6。

    正確的寫法如下所示:

    b = SQUARE(a); a++; // 結(jié)果:a = 6,只自增了一次。

    此外,如果參數(shù)包含函數(shù)調(diào)用,宏展開后,函數(shù)可能會(huì)被重復(fù)調(diào)用。
    如果函數(shù)執(zhí)行結(jié)果相同,則存在浪費(fèi);如果函數(shù)多次調(diào)用結(jié)果不一樣,執(zhí)行結(jié)果可能不符合預(yù)期。

    建議6.2 函數(shù)式宏定義中慎用 return、goto、continue、break 等改變程序流程的語句

    宏中使用 return、goto、continue、break 等改變流程的語句,雖然能簡化代碼,但同時(shí)也隱藏了真實(shí)流程,不易于理解,容易導(dǎo)致資源泄漏等問題。

    首先,宏封裝 return 容易導(dǎo)致過度封裝和使用。
    如下代碼,status的判斷是主干流程的一部分,用宏封裝起來后,變得不直觀了,閱讀時(shí)習(xí)慣性把RETURN_IF宏忽略掉了,從而導(dǎo)致對(duì)主干流程的理解有偏差。

    #define LOG_AND_RETURN_IF_FAIL(ret, fmt, ...) do { \if ((ret) != OK) { \(void)ErrLog(fmt, ##__VA_ARGS__); \return (ret); \} \ } while (0)#define RETURN_IF(cond, ret) do { \if (cond) { \return (ret); \} \ } while (0)ret = InitModuleA(a, b, &status); LOG_AND_RETURN_IF_FAIL(ret, "Init module A failed!"); // OK.RETURN_IF(status != READY, ERR_NOT_READY); // Bad: 重要邏輯不明顯ret = InitModuleB(c); LOG_AND_RETURN_IF_FAIL(ret, "Init module B failed!"); // OK.

    其次,宏封裝 return 也容易引發(fā)內(nèi)存泄漏。再看一個(gè)例子:

    #define CHECK_PTR(ptr, ret) do { \if ((ptr) == NULL) { \return (ret); \} \ } while (0)...mem1 = MemAlloc(...); CHECK_PTR(mem1, ERR_CODE_XXX);mem2 = MemAlloc(...); CHECK_PTR(mem2, ERR_CODE_XXX); // Wrong: 內(nèi)存泄漏

    如果?mem2?申請(qǐng)內(nèi)存失敗了,CHECK_PTR?會(huì)直接返回,而沒有釋放?mem1。
    除此之外,CHECK_PTR?宏命名也不好,宏名只反映了檢查動(dòng)作,沒有指明結(jié)果。只有看了宏實(shí)現(xiàn)才知道指針為空時(shí)返回失敗。

    綜上所述:不推薦宏定義中封裝 return、goto、continue、break 等改變程序流程的語句;
    對(duì)于返回值判斷等異常處理場景可以例外。

    注意:?包含 return、goto、continue、break 等改變流程語句的宏命名,務(wù)必要體現(xiàn)對(duì)應(yīng)關(guān)鍵字。

    建議6.3 函數(shù)式宏不超過10行(非空非注釋)

    函數(shù)式宏本身的一大問題是比函數(shù)更難以調(diào)試和定位,特別是宏過長,調(diào)試和定位的難度更大。
    而且宏擴(kuò)展會(huì)導(dǎo)致目標(biāo)代碼的膨脹。建議函數(shù)式宏不要超過10行。

    7 變量

    在C語言編碼中,除了函數(shù),最重要的就是變量。
    變量在使用時(shí),應(yīng)始終遵循“職責(zé)單一”原則。
    按作用域區(qū)分,變量可分為全局變量和局部變量。

    全局變量

    盡量不用或少用全局變量。
    在程序設(shè)計(jì)中,全局變量是在所有作用域都可訪問的變量。通常,使用不必要的全局變量被認(rèn)為是壞習(xí)慣。

    使用全局變量的缺點(diǎn):

    • 破壞函數(shù)的獨(dú)立性和可移植性,使函數(shù)對(duì)全局變量產(chǎn)生依賴,存在耦合;

    • 降低函數(shù)的代碼可讀性和可維護(hù)性。當(dāng)多個(gè)函數(shù)讀寫全局變量時(shí),某一時(shí)刻其取值可能不是確定的,對(duì)于代碼的閱讀和維護(hù)不利;

    • 在并發(fā)編程環(huán)境中,使用全局變量會(huì)破壞函數(shù)的可重入性,需要增加額外的同步保護(hù)處理才能確保數(shù)據(jù)安全。

    如不可避免,對(duì)全局變量的讀寫應(yīng)集中封裝。

    規(guī)則7.1 模塊間,禁止使用全局變量作接口

    全局變量是模塊內(nèi)部的具體實(shí)現(xiàn),不推薦但允許跨文件使用,但禁止作為模塊接口暴露出去。
    對(duì)全局變量的使用應(yīng)該盡量集中,如果本模塊的數(shù)據(jù)需要對(duì)外部模塊開放,應(yīng)提供對(duì)應(yīng)函數(shù)接口。

    局部變量

    規(guī)則7.2 嚴(yán)禁使用未經(jīng)初始化的變量

    這里的變量,指的是局部動(dòng)態(tài)變量,并且還包括內(nèi)存堆上申請(qǐng)的內(nèi)存塊。
    因?yàn)樗麄兊某跏贾刀际遣豢深A(yù)料的,所以禁止未經(jīng)有效初始化就直接讀取其值。

    void Foo(...) {int data;Bar(data); // Bad: 未初始化就使用... }

    如果有不同分支,要確保所有分支都得到初始化后才能使用:

    void Foo(...) {int data;if (...) {data = 100;}Bar(data); // Bad: 部分分支該值未初始化... }

    未經(jīng)初始化就使用,一般靜態(tài)檢查工具是可以檢查出來的。
    如 PCLint 工具,針對(duì)上述兩個(gè)例子分別會(huì)報(bào)錯(cuò):

    Warning 530: Symbol 'data' (line ...) not initialized Warning 644: Variable 'data' (line ...) may not have been initialized

    規(guī)則7.3 禁止無效、冗余的變量初始化

    如果沒有確定的初始值,而仍然進(jìn)行初始化,不僅不簡潔,反而不安全,可能會(huì)引入更難發(fā)現(xiàn)的問題。

    常見的冗余初始化:

    int cnt = 0; // Bad: 冗余初始化,將會(huì)被后面直接覆蓋 ... cnt = GetXxxCnt(); ...

    對(duì)于后續(xù)有條件賦值的變量,可以在定義時(shí)初始化成默認(rèn)值

    char *buf = NULL; // Good: 這里用 NULL 代表默認(rèn)值 if (condition) {buf = malloc(MEM_SIZE); } ... if (buf != NULL) { // 判斷是否申請(qǐng)過內(nèi)存free(buf); }

    針對(duì)大數(shù)組的冗余清零,更是會(huì)影響到性能。

    char buf[VERY_BIG_SIZE] = {0}; memset(buf, 0, sizeof(buf)); // Bad: 冗余清零

    無效初始化,隱藏更大問題的反例:

    void Foo(...) {int data = 0; // Bad: 習(xí)慣性的進(jìn)行初始化UseData(data); // 使用數(shù)據(jù),本應(yīng)該寫在獲取數(shù)據(jù)后面data = GetData(...); // 獲取數(shù)據(jù)... }

    上例代碼,如果沒有賦 0 初始化,靜態(tài)檢查工具可以幫助發(fā)現(xiàn)“未經(jīng)初始化就直接使用”的問題。
    但因?yàn)闊o效初始化,“使用數(shù)據(jù)”與“獲取數(shù)據(jù)”寫顛倒的缺陷,不能被輕易發(fā)現(xiàn)。

    因此,應(yīng)該寫簡潔的代碼,對(duì)變量或內(nèi)存塊進(jìn)行正確、必要的初始化。

    C99不再限制局部變量定義必須在語句之前,可以按需定義,即在靠近變量使用的地方定義變量。
    這種簡潔的做法,不僅將變量作用域限制更小,而且更方便閱讀和維護(hù),還能解決定義變量時(shí)不知該怎么初始化的問題。
    如果編譯環(huán)境支持,建議按需定義。

    例外:
    遵從“安全規(guī)范”要求,指針變量、表示資源描述符的變量、BOOL變量不作要求。

    規(guī)則7.4 不允許使用魔鬼數(shù)字

    所謂魔鬼數(shù)字即看不懂、難以理解的數(shù)字。
    魔鬼數(shù)字并非一個(gè)非黑即白的概念,看不懂也有程度,需要結(jié)合代碼上下文和業(yè)務(wù)相關(guān)知識(shí)來判斷

    例如數(shù)字 12,在不同的上下文中情況是不一樣的:
    type = 12;?就看不懂,但?month = year * 12;?就能看懂。
    數(shù)字 0 有時(shí)候也是魔鬼數(shù)字,比如?status = 0;?并不能表達(dá)是什么狀態(tài)。

    解決途徑:
    對(duì)于單點(diǎn)使用的數(shù)字,可以增加注釋說明
    對(duì)于多處使用的數(shù)字,必須定義宏或const 變量,并通過符號(hào)命名自注釋。

    禁止出現(xiàn)下列情況:
    沒有通過符號(hào)來解釋數(shù)字含義,如?#define ZERO 0
    符號(hào)命名限制了其取值,如?#define XX_TIMER_INTERVAL_300MS 300

    8 編程實(shí)踐

    表達(dá)式

    建議8.1 表達(dá)式的比較,應(yīng)當(dāng)遵循左側(cè)傾向于變化、右側(cè)傾向于不變的原則

    當(dāng)變量與常量比較時(shí),如果常量放左邊,如?if (MAX == v)?不符合閱讀習(xí)慣,而?if (MAX > v)?更是難于理解。
    應(yīng)當(dāng)按人的正常閱讀、表達(dá)習(xí)慣,將常量放右邊。寫成如下方式:

    if (v == MAX) ... if (v < MAX) ...

    也有特殊情況,如:if (MIN < v && v < MAX)?用來描述區(qū)間時(shí),前半段是常量在左的。

    不用擔(dān)心將 '==' 誤寫成 '=',因?yàn)?if (v = MAX)?會(huì)有編譯告警,其他靜態(tài)檢查工具也會(huì)報(bào)錯(cuò)。讓工具去解決筆誤問題,代碼要符合可讀性第一。

    規(guī)則8.1 含有變量自增或自減運(yùn)算的表達(dá)式中禁止再次引用該變量

    含有變量自增或自減運(yùn)算的表達(dá)式中,如果再引用該變量,其結(jié)果在C標(biāo)準(zhǔn)中未明確定義。各個(gè)編譯器或者同一個(gè)編譯器不同版本實(shí)現(xiàn)可能會(huì)不一致。
    為了更好的可移植性,不應(yīng)該對(duì)標(biāo)準(zhǔn)未定義的運(yùn)算次序做任何假設(shè)。

    注意,運(yùn)算次序的問題不能使用括號(hào)來解決,因?yàn)檫@不是優(yōu)先級(jí)的問題。

    示例:

    x = b[i] + i++; // Bad: b[i]運(yùn)算跟 i++,先后順序并不明確。

    正確的寫法是將自增或自減運(yùn)算單獨(dú)放一行:

    x = b[i] + i; i++; // Good: 單獨(dú)一行

    函數(shù)參數(shù):

    Func(i++, i); // Bad: 傳遞第2個(gè)參數(shù)時(shí),不確定自增運(yùn)算有沒有發(fā)生

    正確的寫法:

    i++; // Good: 單獨(dú)一行 x = Func(i, i);

    建議8.2 用括號(hào)明確表達(dá)式的操作順序,避免過分依賴默認(rèn)優(yōu)先級(jí)

    可以使用括號(hào)強(qiáng)調(diào)表達(dá)式操作順序,防止因默認(rèn)的優(yōu)先級(jí)與設(shè)計(jì)思想不符而導(dǎo)致程序出錯(cuò)。
    然而過多的括號(hào)會(huì)分散代碼使其降低了可讀性,應(yīng)適度使用。

    當(dāng)表達(dá)式包含不常用,優(yōu)先級(jí)易混淆的操作符時(shí),推薦使用括號(hào),比如位操作符:

    c = (a & 0xFF) + b; /* 涉及位操作符,需要括號(hào) */

    語句

    規(guī)則8.2 switch語句要有default分支

    大部分情況下,switch語句中要有default分支,保證在遺漏case標(biāo)簽處理時(shí)能夠有一個(gè)缺省的處理行為。

    特例:
    如果switch條件變量是枚舉類型,并且 case 分支覆蓋了所有取值,則加上default分支處理有些多余。
    現(xiàn)代編譯器都具備檢查是否在switch語句中遺漏了某些枚舉值的case分支的能力,會(huì)有相應(yīng)的warning提示。

    enum Color {RED,BLUE };// 因?yàn)閟witch條件變量是枚舉值,這里可以不用加default處理分支 switch (color) {case RED:DoRedThing();break;case BLUE:DoBlueThing();... break; }

    建議8.3 慎用 goto 語句

    goto語句會(huì)破壞程序的結(jié)構(gòu)性,所以除非確實(shí)需要,最好不使用goto語句。使用時(shí),也只允許跳轉(zhuǎn)到本函數(shù)goto語句之后的語句。

    goto語句通常用來實(shí)現(xiàn)函數(shù)單點(diǎn)返回。
    同一個(gè)函數(shù)體內(nèi)部存在大量相同的邏輯但又不方便封裝成函數(shù)的情況下,譬如反復(fù)執(zhí)行文件操作, 對(duì)文件操作失敗以后的處理部分代碼(譬如關(guān)閉文件句柄,釋放動(dòng)態(tài)申請(qǐng)的內(nèi)存等等), 一般會(huì)放在該函數(shù)體的最后部分,在需要的地方就goto到那里,這樣代碼反而變得清晰簡潔。實(shí)際也可以封裝成函數(shù)或者封裝成宏,但是這么做會(huì)讓代碼變得沒那么直接明了。

    示例:

    // Good: 使用 goto 實(shí)現(xiàn)單點(diǎn)返回 int SomeInitFunc(void) {void *p1;void *p2 = NULL;void *p3 = NULL;p1 = malloc(MEM_LEN);if (p1 == NULL) {goto EXIT;}p2 = malloc(MEM_LEN);if (p2 == NULL) {goto EXIT;}p3 = malloc(MEM_LEN);if (p3 == NULL) {goto EXIT;}DoSomething(p1, p2, p3);return 0; // OK.EXIT:if (p3 != NULL) {free(p3);}if (p2 != NULL) {free(p2);}if (p1 != NULL) {free(p1);}return -1; // Failed! }

    類型轉(zhuǎn)換

    建議8.4 盡量減少?zèng)]有必要的數(shù)據(jù)類型默認(rèn)轉(zhuǎn)換與強(qiáng)制轉(zhuǎn)換

    當(dāng)進(jìn)行數(shù)據(jù)類型強(qiáng)制轉(zhuǎn)換時(shí),其數(shù)據(jù)的意義、轉(zhuǎn)換后的取值等都有可能發(fā)生變化,而這些細(xì)節(jié)若考慮不周,就很有可能留下隱患。

    如下賦值,多數(shù)編譯器不產(chǎn)生告警,但值的含義還是稍有變化。

    char ch; unsigned short int exam;ch = -1; exam = ch; // Bad: 編譯器不產(chǎn)生告警,此時(shí)exam為0xFFFF。

    推薦閱讀:

    專輯|Linux文章匯總

    專輯|程序人生

    專輯|C語言

    我的知識(shí)小密圈

    總結(jié)

    以上是生活随笔為你收集整理的C语言编程规范 clean code的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。

    国产亚洲欧美在线专区 | 野狼第一精品社区 | 久久国产36精品色熟妇 | 久久久久免费精品国产 | 亚洲a无码综合a国产av中文 | 日韩精品久久久肉伦网站 | 人妻无码αv中文字幕久久琪琪布 | 最近免费中文字幕中文高清百度 | 丝袜足控一区二区三区 | 97久久国产亚洲精品超碰热 | 2020久久香蕉国产线看观看 | 丝袜足控一区二区三区 | 粉嫩少妇内射浓精videos | 欧美 日韩 亚洲 在线 | 国产艳妇av在线观看果冻传媒 | aⅴ在线视频男人的天堂 | 国产精品久久久av久久久 | 久久精品99久久香蕉国产色戒 | 国产深夜福利视频在线 | 人人澡人摸人人添 | 国产成人无码av片在线观看不卡 | 无码人妻少妇伦在线电影 | 欧美35页视频在线观看 | 国产成人无码a区在线观看视频app | 少妇无码一区二区二三区 | 麻豆国产丝袜白领秘书在线观看 | 狠狠躁日日躁夜夜躁2020 | 中文字幕无线码免费人妻 | 网友自拍区视频精品 | 国产成人无码av片在线观看不卡 | 国产片av国语在线观看 | 国产在线精品一区二区高清不卡 | 国产精品久久久久久无码 | 性欧美疯狂xxxxbbbb | 亚洲精品中文字幕久久久久 | 好男人社区资源 | 国产特级毛片aaaaaa高潮流水 | 亚洲一区二区三区偷拍女厕 | 国产精品免费大片 | 国产97人人超碰caoprom | 99riav国产精品视频 | 久久精品国产精品国产精品污 | 亚洲精品国产第一综合99久久 | 噜噜噜亚洲色成人网站 | 纯爱无遮挡h肉动漫在线播放 | 麻豆国产丝袜白领秘书在线观看 | 曰韩无码二三区中文字幕 | 久久无码专区国产精品s | 少妇人妻大乳在线视频 | 久久综合给合久久狠狠狠97色 | 在教室伦流澡到高潮hnp视频 | 一本色道久久综合狠狠躁 | 色一情一乱一伦一视频免费看 | 中文无码精品a∨在线观看不卡 | 欧美怡红院免费全部视频 | 麻花豆传媒剧国产免费mv在线 | 国产女主播喷水视频在线观看 | 欧美日韩一区二区免费视频 | 亚洲精品无码国产 | 日韩av无码中文无码电影 | 国产在线精品一区二区三区直播 | 大地资源中文第3页 | 无码av中文字幕免费放 | 欧美一区二区三区视频在线观看 | 麻豆精产国品 | 婷婷综合久久中文字幕蜜桃三电影 | 欧美人与物videos另类 | 无码国产激情在线观看 | 99久久精品午夜一区二区 | 粉嫩少妇内射浓精videos | 国产午夜无码视频在线观看 | 激情综合激情五月俺也去 | 又紧又大又爽精品一区二区 | 鲁鲁鲁爽爽爽在线视频观看 | 97精品国产97久久久久久免费 | 18禁止看的免费污网站 | aⅴ在线视频男人的天堂 | 牛和人交xxxx欧美 | 国产97色在线 | 免 | 久久精品国产一区二区三区肥胖 | 小sao货水好多真紧h无码视频 | 久久成人a毛片免费观看网站 | 国产精品福利视频导航 | 偷窥日本少妇撒尿chinese | 中文字幕无码热在线视频 | 成年美女黄网站色大免费全看 | 亚洲无人区一区二区三区 | 99精品无人区乱码1区2区3区 | 国产日产欧产精品精品app | 丰满少妇熟乱xxxxx视频 | 亚洲精品www久久久 | 麻豆成人精品国产免费 | 噜噜噜亚洲色成人网站 | 领导边摸边吃奶边做爽在线观看 | 99精品无人区乱码1区2区3区 | 鲁大师影院在线观看 | 国产精品福利视频导航 | 午夜精品久久久内射近拍高清 | 日韩欧美群交p片內射中文 | 日本大乳高潮视频在线观看 | 亚洲成a人片在线观看无码3d | 亚洲精品www久久久 | 中文毛片无遮挡高清免费 | 熟女少妇人妻中文字幕 | 国产舌乚八伦偷品w中 | 久久久久亚洲精品中文字幕 | 国产人妻久久精品二区三区老狼 | 无码av免费一区二区三区试看 | 国内少妇偷人精品视频 | 精品夜夜澡人妻无码av蜜桃 | 久久午夜无码鲁丝片秋霞 | 国产成人精品必看 | 国产极品视觉盛宴 | 又紧又大又爽精品一区二区 | 国产亚洲tv在线观看 | 美女毛片一区二区三区四区 | 色五月丁香五月综合五月 | 粉嫩少妇内射浓精videos | 欧美丰满熟妇xxxx | 国产麻豆精品一区二区三区v视界 | 亚洲狠狠色丁香婷婷综合 | 欧美人与禽zoz0性伦交 | 欧美日韩一区二区综合 | 亚洲精品无码人妻无码 | 少妇激情av一区二区 | 欧美丰满老熟妇xxxxx性 | 狠狠色噜噜狠狠狠7777奇米 | 国产成人无码午夜视频在线观看 | 日韩人妻无码中文字幕视频 | 少妇太爽了在线观看 | 亚洲国精产品一二二线 | 欧美亚洲国产一区二区三区 | 99视频精品全部免费免费观看 | 国产99久久精品一区二区 | 欧洲精品码一区二区三区免费看 | 欧美日韩人成综合在线播放 | 无码人妻av免费一区二区三区 | 丰满少妇弄高潮了www | 最近中文2019字幕第二页 | 夜夜高潮次次欢爽av女 | 97夜夜澡人人爽人人喊中国片 | 狠狠色噜噜狠狠狠7777奇米 | 国产精品99爱免费视频 | 国产精品久久久久9999小说 | 小sao货水好多真紧h无码视频 | 国产成人精品久久亚洲高清不卡 | 国产69精品久久久久app下载 | 欧美真人作爱免费视频 | 少妇人妻av毛片在线看 | 国产精品无码成人午夜电影 | 在线精品亚洲一区二区 | 日韩人妻无码中文字幕视频 | 国产精品美女久久久久av爽李琼 | 亚洲成在人网站无码天堂 | 十八禁视频网站在线观看 | 天堂在线观看www | 中文无码精品a∨在线观看不卡 | 国产精品亚洲а∨无码播放麻豆 | 美女扒开屁股让男人桶 | 无码人妻精品一区二区三区下载 | 国精品人妻无码一区二区三区蜜柚 | 夜夜夜高潮夜夜爽夜夜爰爰 | 乱人伦中文视频在线观看 | 亚洲无人区一区二区三区 | 亚洲码国产精品高潮在线 | 欧美精品一区二区精品久久 | 亚洲精品久久久久中文第一幕 | 亚洲综合无码久久精品综合 | 狠狠色欧美亚洲狠狠色www | 国内精品久久久久久中文字幕 | 精品亚洲韩国一区二区三区 | 国内少妇偷人精品视频 | 色婷婷香蕉在线一区二区 | 国产乱子伦视频在线播放 | 亚洲国产av精品一区二区蜜芽 | 天堂久久天堂av色综合 | 精品无码国产一区二区三区av | 狂野欧美激情性xxxx | 天堂亚洲2017在线观看 | 亚洲成熟女人毛毛耸耸多 | 蜜桃av蜜臀av色欲av麻 999久久久国产精品消防器材 | 娇妻被黑人粗大高潮白浆 | 日韩欧美中文字幕公布 | 熟妇人妻无码xxx视频 | 亚洲国产精品一区二区美利坚 | 亚洲成a人片在线观看日本 | 欧美三级不卡在线观看 | 日韩av无码一区二区三区 | 亚洲s码欧洲m码国产av | 99久久亚洲精品无码毛片 | 荫蒂被男人添的好舒服爽免费视频 | 欧美人与禽zoz0性伦交 | 国产性猛交╳xxx乱大交 国产精品久久久久久无码 欧洲欧美人成视频在线 | 又粗又大又硬毛片免费看 | 曰韩少妇内射免费播放 | 国产无套内射久久久国产 | 国产精品久久久午夜夜伦鲁鲁 | 国产亚洲精品久久久久久久 | 中文字幕无码免费久久9一区9 | 亚洲色www成人永久网址 | 久久久亚洲欧洲日产国码αv | 55夜色66夜色国产精品视频 | 一个人免费观看的www视频 | 人妻有码中文字幕在线 | 日日摸夜夜摸狠狠摸婷婷 | 精品无码一区二区三区爱欲 | 综合人妻久久一区二区精品 | 久久久久亚洲精品男人的天堂 | 性生交大片免费看女人按摩摩 | 18禁黄网站男男禁片免费观看 | 中文字幕无码视频专区 | 日韩成人一区二区三区在线观看 | 国产成人无码a区在线观看视频app | 精品久久久无码中文字幕 | 少妇无码av无码专区在线观看 | 欧美熟妇另类久久久久久多毛 | 国产精品久久国产精品99 | 亚洲日韩乱码中文无码蜜桃臀网站 | 久久综合激激的五月天 | 一本色道久久综合亚洲精品不卡 | 成人综合网亚洲伊人 | 久久人人爽人人爽人人片av高清 | 亚洲熟妇自偷自拍另类 | 国产成人av免费观看 | 性做久久久久久久久 | 精品无人国产偷自产在线 | 亚洲成a人片在线观看无码3d | 国产 精品 自在自线 | 国产精品久久久一区二区三区 | 丰腴饱满的极品熟妇 | 中文字幕无码人妻少妇免费 | 亚洲综合另类小说色区 | 日本护士毛茸茸高潮 | 免费播放一区二区三区 | 国产美女极度色诱视频www | 欧美大屁股xxxxhd黑色 | 成人性做爰aaa片免费看不忠 | 精品国产av色一区二区深夜久久 | 亚洲中文字幕久久无码 | 一二三四在线观看免费视频 | 中文字幕乱码中文乱码51精品 | 国精产品一品二品国精品69xx | 精品人妻人人做人人爽夜夜爽 | 俄罗斯老熟妇色xxxx | 国产内射老熟女aaaa | 人妻互换免费中文字幕 | 欧美日韩一区二区免费视频 | 狠狠亚洲超碰狼人久久 | 97无码免费人妻超级碰碰夜夜 | 牲欲强的熟妇农村老妇女视频 | 99久久婷婷国产综合精品青草免费 | 国产精品无码一区二区桃花视频 | 人人妻在人人 | 三级4级全黄60分钟 | 极品嫩模高潮叫床 | 人妻体内射精一区二区三四 | 丰满少妇弄高潮了www | 人妻有码中文字幕在线 | 成人精品视频一区二区三区尤物 | 亚洲乱码国产乱码精品精 | 国产精品亚洲一区二区三区喷水 | 久久亚洲精品中文字幕无男同 | a片免费视频在线观看 | 亚洲成av人片在线观看无码不卡 | 国产极品视觉盛宴 | 亚洲天堂2017无码中文 | 少妇性l交大片欧洲热妇乱xxx | 国产在线无码精品电影网 | 色诱久久久久综合网ywww | 成人精品一区二区三区中文字幕 | 国产精品.xx视频.xxtv | 国产免费观看黄av片 | 久久久www成人免费毛片 | 人人澡人人透人人爽 | 激情内射亚州一区二区三区爱妻 | 亚洲经典千人经典日产 | 无码av中文字幕免费放 | 国产农村妇女高潮大叫 | 欧美日韩视频无码一区二区三 | 一本久久a久久精品亚洲 | 美女毛片一区二区三区四区 | 亚洲爆乳无码专区 | 国产偷自视频区视频 | 中文字幕久久久久人妻 | 亚洲一区二区三区无码久久 | 国产成人一区二区三区别 | 国产一精品一av一免费 | 久久人人爽人人人人片 | 黑人巨大精品欧美一区二区 | 99riav国产精品视频 | 欧美国产亚洲日韩在线二区 | 国语精品一区二区三区 | 爱做久久久久久 | 国产精品自产拍在线观看 | 又湿又紧又大又爽a视频国产 | 中文字幕乱码人妻无码久久 | 在线 国产 欧美 亚洲 天堂 | 精品亚洲韩国一区二区三区 | 精品人妻中文字幕有码在线 | 高潮喷水的毛片 | 天堂无码人妻精品一区二区三区 | 老熟妇仑乱视频一区二区 | 精品国精品国产自在久国产87 | 国产一区二区三区四区五区加勒比 | 久久午夜无码鲁丝片 | 人妻人人添人妻人人爱 | 97资源共享在线视频 | 国产精品资源一区二区 | 亚洲一区二区三区 | 中文字幕人成乱码熟女app | 99久久婷婷国产综合精品青草免费 | 国产97人人超碰caoprom | 国产亚洲日韩欧美另类第八页 | 十八禁真人啪啪免费网站 | 99久久久国产精品无码免费 | 久久精品丝袜高跟鞋 | 天天拍夜夜添久久精品大 | 成人亚洲精品久久久久软件 | 欧美人与物videos另类 | 一本久久a久久精品vr综合 | 亚洲午夜无码久久 | 亚洲国产精品久久久久久 | 久精品国产欧美亚洲色aⅴ大片 | 无码av最新清无码专区吞精 | 999久久久国产精品消防器材 | 亚洲午夜无码久久 | 久久综合激激的五月天 | 欧美黑人乱大交 | 国产色视频一区二区三区 | 亚洲色欲久久久综合网东京热 | 国产特级毛片aaaaaa高潮流水 | 精品久久久中文字幕人妻 | 亚洲中文无码av永久不收费 | 久久97精品久久久久久久不卡 | 亚洲自偷自偷在线制服 | 宝宝好涨水快流出来免费视频 | www成人国产高清内射 | 天天摸天天碰天天添 | 国产免费久久精品国产传媒 | 玩弄中年熟妇正在播放 | 国产无遮挡又黄又爽免费视频 | 日韩在线不卡免费视频一区 | 人妻尝试又大又粗久久 | 欧美激情一区二区三区成人 | 亚洲aⅴ无码成人网站国产app | 欧美性猛交内射兽交老熟妇 | 99国产精品白浆在线观看免费 | 国产人妻人伦精品1国产丝袜 | 纯爱无遮挡h肉动漫在线播放 | 久久精品国产99久久6动漫 | 国产亚洲人成a在线v网站 | 日本高清一区免费中文视频 | 国产精品久久久久影院嫩草 | 国产av人人夜夜澡人人爽麻豆 | 欧美性黑人极品hd | 中文字幕人妻无码一区二区三区 | 日产精品高潮呻吟av久久 | 欧美亚洲日韩国产人成在线播放 | 欧美熟妇另类久久久久久不卡 | 无码乱肉视频免费大全合集 | 国产三级久久久精品麻豆三级 | 欧美xxxx黑人又粗又长 | 久久久久免费看成人影片 | 欧美性猛交xxxx富婆 | 国产三级精品三级男人的天堂 | 国内精品久久久久久中文字幕 | 少妇高潮一区二区三区99 | 中文字幕无码免费久久99 | 四十如虎的丰满熟妇啪啪 | 亚洲色偷偷男人的天堂 | 欧美性色19p | 国产亚洲日韩欧美另类第八页 | aa片在线观看视频在线播放 | 女人高潮内射99精品 | 国产人妻人伦精品1国产丝袜 | 久久精品国产99精品亚洲 | 亚洲日韩精品欧美一区二区 | 夫妻免费无码v看片 | 国产精品美女久久久网av | 日本丰满护士爆乳xxxx | 丰满少妇高潮惨叫视频 | 少妇的肉体aa片免费 | 免费男性肉肉影院 | 亚洲中文字幕乱码av波多ji | 国产亚洲精品久久久ai换 | 中文字幕无线码免费人妻 | 亚洲综合色区中文字幕 | 国产人妻人伦精品 | 日本爽爽爽爽爽爽在线观看免 | 久久人人97超碰a片精品 | 国产亚洲欧美日韩亚洲中文色 | 国产成人综合在线女婷五月99播放 | 久久亚洲中文字幕精品一区 | 强伦人妻一区二区三区视频18 | 大地资源中文第3页 | 久在线观看福利视频 | 少妇高潮一区二区三区99 | 欧洲vodafone精品性 | 九九综合va免费看 | 亚洲第一无码av无码专区 | 中文亚洲成a人片在线观看 | 无码中文字幕色专区 | 性生交大片免费看女人按摩摩 | 国产九九九九九九九a片 | 18精品久久久无码午夜福利 | 亚拍精品一区二区三区探花 | 成人欧美一区二区三区 | 性做久久久久久久久 | 国产日产欧产精品精品app | 久久精品国产精品国产精品污 | 亚洲一区二区三区 | 亚洲综合伊人久久大杳蕉 | 在线观看欧美一区二区三区 | 正在播放老肥熟妇露脸 | 丰满人妻一区二区三区免费视频 | 免费无码一区二区三区蜜桃大 | 欧美国产日韩亚洲中文 | 东京一本一道一二三区 | 亚洲 激情 小说 另类 欧美 | 精品久久久久香蕉网 | 中文字幕 人妻熟女 | 亚洲の无码国产の无码步美 | 欧美猛少妇色xxxxx | 久久亚洲精品中文字幕无男同 | 偷窥村妇洗澡毛毛多 | 一本久久伊人热热精品中文字幕 | 麻豆人妻少妇精品无码专区 | 天下第一社区视频www日本 | 久久亚洲精品中文字幕无男同 | 沈阳熟女露脸对白视频 | 亚洲日韩av一区二区三区四区 | 玩弄中年熟妇正在播放 | 国产亚洲精品久久久久久久 | 国产精品亚洲lv粉色 | 国产亚洲欧美日韩亚洲中文色 | 台湾无码一区二区 | 无套内谢老熟女 | 免费看少妇作爱视频 | 亚洲中文无码av永久不收费 | av无码电影一区二区三区 | 国产成人久久精品流白浆 | 又湿又紧又大又爽a视频国产 | 日韩人妻无码一区二区三区久久99 | 日本一区二区三区免费高清 | 强伦人妻一区二区三区视频18 | 在线播放亚洲第一字幕 | 久久99精品国产麻豆蜜芽 | 国产午夜福利100集发布 | 欧美精品在线观看 | 狠狠综合久久久久综合网 | 久久天天躁狠狠躁夜夜免费观看 | 精品无人国产偷自产在线 | 亚洲色欲色欲欲www在线 | 女人高潮内射99精品 | 四虎永久在线精品免费网址 | 一本久道高清无码视频 | 午夜肉伦伦影院 | 国产人妖乱国产精品人妖 | 久久五月精品中文字幕 | 亚洲第一网站男人都懂 | 日本乱人伦片中文三区 | 51国偷自产一区二区三区 | 老熟妇乱子伦牲交视频 | 亚洲精品成人福利网站 | 国产色视频一区二区三区 | 亚洲国产精品毛片av不卡在线 | 国内老熟妇对白xxxxhd | 日韩在线不卡免费视频一区 | 国产av一区二区精品久久凹凸 | 无码纯肉视频在线观看 | 久久久久成人精品免费播放动漫 | 欧洲熟妇色 欧美 | 精品久久久中文字幕人妻 | 中文久久乱码一区二区 | 国产激情一区二区三区 | 十八禁视频网站在线观看 | 国产成人综合色在线观看网站 | 国产亚洲欧美日韩亚洲中文色 | 99久久精品日本一区二区免费 | 欧美激情综合亚洲一二区 | 扒开双腿疯狂进出爽爽爽视频 | 国产特级毛片aaaaaa高潮流水 | 欧美日韩久久久精品a片 | 无码av岛国片在线播放 | 好男人社区资源 | 色婷婷久久一区二区三区麻豆 | 婷婷五月综合缴情在线视频 | 天天av天天av天天透 | 免费观看黄网站 | 精品久久久久久人妻无码中文字幕 | 一本色道久久综合狠狠躁 | 国产在线精品一区二区高清不卡 | 蜜桃视频韩日免费播放 | 我要看www免费看插插视频 | 久久综合香蕉国产蜜臀av | 无套内谢的新婚少妇国语播放 | yw尤物av无码国产在线观看 | 亚洲一区av无码专区在线观看 | 亚洲精品一区二区三区婷婷月 | 久久久久99精品国产片 | 亚洲aⅴ无码成人网站国产app | 亚洲精品一区二区三区在线观看 | 国产成人综合美国十次 | 激情综合激情五月俺也去 | 日本一卡2卡3卡四卡精品网站 | 国产极品美女高潮无套在线观看 | 人人妻人人澡人人爽欧美一区九九 | 国产高清不卡无码视频 | 无码任你躁久久久久久久 | 四虎4hu永久免费 | 精品 日韩 国产 欧美 视频 | 精品亚洲韩国一区二区三区 | 欧美激情一区二区三区成人 | 国产九九九九九九九a片 | 亚洲日本va午夜在线电影 | 无码人妻久久一区二区三区不卡 | 天天躁夜夜躁狠狠是什么心态 | 波多野结衣av一区二区全免费观看 | 亚欧洲精品在线视频免费观看 | 丁香花在线影院观看在线播放 | 综合人妻久久一区二区精品 | 国产精品久久久久9999小说 | 亚洲自偷自拍另类第1页 | 亚洲国产日韩a在线播放 | 熟女俱乐部五十路六十路av | 亚洲日本va中文字幕 | 激情五月综合色婷婷一区二区 | 久久国产精品二国产精品 | 欧美猛少妇色xxxxx | 国产精品成人av在线观看 | 97夜夜澡人人爽人人喊中国片 | 在线a亚洲视频播放在线观看 | 蜜桃臀无码内射一区二区三区 | 中文字幕乱码人妻二区三区 | 亚洲成熟女人毛毛耸耸多 | 国产乱码精品一品二品 | 国产精品毛多多水多 | 国产97在线 | 亚洲 | 性生交片免费无码看人 | 在线а√天堂中文官网 | 国产亚洲精品久久久ai换 | 亚洲色欲色欲欲www在线 | 强奷人妻日本中文字幕 | 国产成人精品必看 | 小泽玛莉亚一区二区视频在线 | 国产精品久久久久无码av色戒 | 免费男性肉肉影院 | 精品日本一区二区三区在线观看 | 亚洲国产欧美在线成人 | 国产人妻精品一区二区三区 | 国产精品久久久久久久9999 | 日本xxxx色视频在线观看免费 | 亚洲人成人无码网www国产 | 成人精品一区二区三区中文字幕 | 色综合久久久久综合一本到桃花网 | 精品国产一区av天美传媒 | 国语自产偷拍精品视频偷 | 久久亚洲a片com人成 | 国产人妻精品午夜福利免费 | 久久伊人色av天堂九九小黄鸭 | 亚洲精品久久久久中文第一幕 | 婷婷综合久久中文字幕蜜桃三电影 | 免费网站看v片在线18禁无码 | 人妻少妇被猛烈进入中文字幕 | 好爽又高潮了毛片免费下载 | 西西人体www44rt大胆高清 | 国产激情精品一区二区三区 | 丰腴饱满的极品熟妇 | 精品久久久无码中文字幕 | 我要看www免费看插插视频 | 欧美野外疯狂做受xxxx高潮 | 麻豆国产97在线 | 欧洲 | 亚洲精品欧美二区三区中文字幕 | 少妇无码一区二区二三区 | 性啪啪chinese东北女人 | 激情爆乳一区二区三区 | 欧美人妻一区二区三区 | 思思久久99热只有频精品66 | 国产精品久久国产三级国 | 黑人玩弄人妻中文在线 | 一本色道久久综合亚洲精品不卡 | 99久久无码一区人妻 | 欧美性猛交内射兽交老熟妇 | 色诱久久久久综合网ywww | 奇米影视7777久久精品人人爽 | 欧美熟妇另类久久久久久不卡 | 无码人妻av免费一区二区三区 | 免费视频欧美无人区码 | 中文无码精品a∨在线观看不卡 | 夜夜高潮次次欢爽av女 | 波多野结衣aⅴ在线 | 欧美性猛交内射兽交老熟妇 | 又大又硬又黄的免费视频 | 熟妇激情内射com | 国产高清不卡无码视频 | 国产午夜福利100集发布 | 亚洲s码欧洲m码国产av | 久久综合狠狠综合久久综合88 | 国产在热线精品视频 | 国产美女极度色诱视频www | 精品成人av一区二区三区 | 红桃av一区二区三区在线无码av | 人妻少妇精品视频专区 | 无码国产激情在线观看 | 成人无码精品1区2区3区免费看 | 无码一区二区三区在线观看 | 强辱丰满人妻hd中文字幕 | 日韩精品无码免费一区二区三区 | 我要看www免费看插插视频 | 亚洲自偷自偷在线制服 | 99er热精品视频 | 国产va免费精品观看 | 国产精品怡红院永久免费 | 亚洲最大成人网站 | 国产内射老熟女aaaa | 久久99精品久久久久婷婷 | 久久精品国产99久久6动漫 | 熟女少妇在线视频播放 | 在线观看国产午夜福利片 | 日本熟妇浓毛 | 中文字幕中文有码在线 | 日韩av无码中文无码电影 | 亚洲一区二区三区香蕉 | 亚洲成a人片在线观看无码 | 国产97色在线 | 免 | 精品乱子伦一区二区三区 | 色欲av亚洲一区无码少妇 | 九九久久精品国产免费看小说 | 久久久久99精品成人片 | 国产亚洲人成a在线v网站 | 国内综合精品午夜久久资源 | 国产人妻精品一区二区三区 | 国产香蕉尹人视频在线 | 97色伦图片97综合影院 | 国产suv精品一区二区五 | 玩弄少妇高潮ⅹxxxyw | 色五月五月丁香亚洲综合网 | 久久综合给合久久狠狠狠97色 | 日本精品人妻无码77777 天堂一区人妻无码 | 国产亚洲精品精品国产亚洲综合 | 国产人妻精品一区二区三区不卡 | 久久99精品久久久久久 | 久久99精品国产麻豆蜜芽 | 日韩精品一区二区av在线 | 久久精品一区二区三区四区 | 亚洲s色大片在线观看 | 亚洲综合色区中文字幕 | 午夜福利一区二区三区在线观看 | 国产激情艳情在线看视频 | 久久亚洲中文字幕无码 | 国产精品高潮呻吟av久久4虎 | 国产日产欧产精品精品app | 国产精品-区区久久久狼 | 麻豆精产国品 | 成人免费视频在线观看 | 一个人免费观看的www视频 | 国产精品人妻一区二区三区四 | 亚洲色欲久久久综合网东京热 | yw尤物av无码国产在线观看 | 国产亚洲精品久久久久久久久动漫 | 国产国语老龄妇女a片 | 国产无遮挡又黄又爽免费视频 | 久久综合香蕉国产蜜臀av | 久久精品国产精品国产精品污 | 18无码粉嫩小泬无套在线观看 | 夜夜夜高潮夜夜爽夜夜爰爰 | 扒开双腿吃奶呻吟做受视频 | 亚洲中文字幕无码一久久区 | 日韩人妻少妇一区二区三区 | 国产免费无码一区二区视频 | 美女毛片一区二区三区四区 | 国产午夜福利亚洲第一 | 久久久久se色偷偷亚洲精品av | 亚洲精品综合五月久久小说 | 玩弄少妇高潮ⅹxxxyw | 国产 精品 自在自线 | 欧美性色19p | 无码人妻精品一区二区三区不卡 | 国产精品成人av在线观看 | 婷婷丁香六月激情综合啪 | 97se亚洲精品一区 | 丁香花在线影院观看在线播放 | 亚洲成av人在线观看网址 | 国产日产欧产精品精品app | 久久精品一区二区三区四区 | 性做久久久久久久久 | 国产福利视频一区二区 | 久久www免费人成人片 | 久久亚洲国产成人精品性色 | 给我免费的视频在线观看 | 色欲久久久天天天综合网精品 | 亚洲人亚洲人成电影网站色 | 成熟妇人a片免费看网站 | 国产明星裸体无码xxxx视频 | 亚洲色偷偷偷综合网 | 波多野结衣av一区二区全免费观看 | 亚洲 欧美 激情 小说 另类 | 天堂а√在线地址中文在线 | 成人性做爰aaa片免费看不忠 | 少女韩国电视剧在线观看完整 | 一二三四在线观看免费视频 | 大胆欧美熟妇xx | 性欧美videos高清精品 | 久久久无码中文字幕久... | 国产成人精品无码播放 | 色婷婷香蕉在线一区二区 | 久久久久久av无码免费看大片 | 国产亚洲精品久久久久久大师 | 暴力强奷在线播放无码 | 无码毛片视频一区二区本码 | 国产国产精品人在线视 | 中文字幕无码av波多野吉衣 | 丰腴饱满的极品熟妇 | 亚洲啪av永久无码精品放毛片 | 中文字幕无线码免费人妻 | 国产精品国产三级国产专播 | 男人的天堂av网站 | 国产精品无码一区二区桃花视频 | 久久人妻内射无码一区三区 | 国産精品久久久久久久 | 精品无码国产自产拍在线观看蜜 | 性生交大片免费看女人按摩摩 | 色综合久久中文娱乐网 | 丰腴饱满的极品熟妇 | 18禁黄网站男男禁片免费观看 | 欧美日韩亚洲国产精品 | 久久精品人妻少妇一区二区三区 | 全球成人中文在线 | 中文无码伦av中文字幕 | 无码午夜成人1000部免费视频 | 日韩精品成人一区二区三区 | 日韩精品一区二区av在线 | 精品熟女少妇av免费观看 | 久久综合久久自在自线精品自 | 亚洲精品午夜无码电影网 | 久久亚洲a片com人成 | 综合网日日天干夜夜久久 | 国产特级毛片aaaaaaa高清 | 嫩b人妻精品一区二区三区 | 久久综合狠狠综合久久综合88 | 日本一本二本三区免费 | 国产av一区二区三区最新精品 | 亚洲の无码国产の无码影院 | 无码任你躁久久久久久久 | 免费观看又污又黄的网站 | 强奷人妻日本中文字幕 | 久久久久免费精品国产 | 国产成人人人97超碰超爽8 | 精品国精品国产自在久国产87 | 欧美高清在线精品一区 | 日韩av无码中文无码电影 | 999久久久国产精品消防器材 | a国产一区二区免费入口 | 暴力强奷在线播放无码 | 99久久99久久免费精品蜜桃 | 久久久久99精品成人片 | 樱花草在线播放免费中文 | 精品人妻人人做人人爽夜夜爽 | 亚洲国产精品美女久久久久 | 亚洲精品一区二区三区在线 | 久久久久久亚洲精品a片成人 | 国产人妻人伦精品 | 亚洲综合精品香蕉久久网 | 午夜精品久久久内射近拍高清 | 亚洲狠狠色丁香婷婷综合 | 大地资源网第二页免费观看 | 免费看少妇作爱视频 | 国产片av国语在线观看 | 久久久久久国产精品无码下载 | 国产又爽又黄又刺激的视频 | 亚洲欧美精品伊人久久 | 亚洲爆乳大丰满无码专区 | 国产麻豆精品精东影业av网站 | 999久久久国产精品消防器材 | 四虎影视成人永久免费观看视频 | 亚洲精品国产a久久久久久 | 亚洲国产精品美女久久久久 | 老子影院午夜精品无码 | 97精品国产97久久久久久免费 | 东京热一精品无码av | 蜜桃臀无码内射一区二区三区 | 无码纯肉视频在线观看 | 久久久久成人片免费观看蜜芽 | 无码国模国产在线观看 | 欧美亚洲日韩国产人成在线播放 | 日日摸日日碰夜夜爽av | 人妻插b视频一区二区三区 | 国产另类ts人妖一区二区 | 亚洲中文字幕成人无码 | 国产精品亚洲一区二区三区喷水 | 国产精品自产拍在线观看 | 欧美精品一区二区精品久久 | 国产va免费精品观看 | 国产成人无码a区在线观看视频app | 亚洲s色大片在线观看 | 日本一卡2卡3卡4卡无卡免费网站 国产一区二区三区影院 | 欧美丰满熟妇xxxx性ppx人交 | 人妻互换免费中文字幕 | 97夜夜澡人人双人人人喊 | 奇米影视888欧美在线观看 | 学生妹亚洲一区二区 | 久久久久久九九精品久 | 亚洲欧美综合区丁香五月小说 | 特黄特色大片免费播放器图片 | 久久久无码中文字幕久... | 久久99精品久久久久久 | 亚洲精品中文字幕 | 黑人大群体交免费视频 | 国产亚洲精品久久久久久大师 | 天堂在线观看www | 亚洲一区二区观看播放 | 国产精品资源一区二区 | 亚洲午夜无码久久 | 3d动漫精品啪啪一区二区中 | 久激情内射婷内射蜜桃人妖 | 熟女少妇在线视频播放 | 樱花草在线播放免费中文 | 亚洲国产精品无码久久久久高潮 | 高潮喷水的毛片 | 亚洲 a v无 码免 费 成 人 a v | 熟妇人妻激情偷爽文 | 免费中文字幕日韩欧美 | 色综合久久久久综合一本到桃花网 | 图片区 小说区 区 亚洲五月 | 在线观看欧美一区二区三区 | 天天拍夜夜添久久精品 | 免费国产黄网站在线观看 | 亚洲国产精品久久人人爱 | 欧美老妇与禽交 | 久久久婷婷五月亚洲97号色 | 亚洲精品中文字幕久久久久 | 无码人妻精品一区二区三区下载 | 国产办公室秘书无码精品99 | 久久精品女人的天堂av | 青青久在线视频免费观看 | 88国产精品欧美一区二区三区 | 在线观看国产午夜福利片 | 熟女俱乐部五十路六十路av | 国产成人无码av在线影院 | 激情国产av做激情国产爱 | 国产色精品久久人妻 | 国产免费无码一区二区视频 | 色欲人妻aaaaaaa无码 | 日韩精品一区二区av在线 | 人妻少妇精品无码专区动漫 | 动漫av网站免费观看 | 国产成人人人97超碰超爽8 | 久久久久人妻一区精品色欧美 | 国产精品无码久久av | 午夜精品久久久久久久久 | 在线成人www免费观看视频 | 亚洲 高清 成人 动漫 | 久久久www成人免费毛片 | 国内少妇偷人精品视频 | 日日躁夜夜躁狠狠躁 | 精品无人区无码乱码毛片国产 | 国产成人无码专区 | 扒开双腿疯狂进出爽爽爽视频 | 色五月丁香五月综合五月 | 亚洲呦女专区 | 亚洲 a v无 码免 费 成 人 a v | 嫩b人妻精品一区二区三区 | 无码国模国产在线观看 | 成熟人妻av无码专区 | 亚洲无人区午夜福利码高清完整版 | 中文字幕日产无线码一区 | 久久精品成人欧美大片 | 婷婷丁香六月激情综合啪 | 性欧美牲交xxxxx视频 | 97精品人妻一区二区三区香蕉 | 日日噜噜噜噜夜夜爽亚洲精品 | 丝袜美腿亚洲一区二区 | 黑人大群体交免费视频 | 无码av免费一区二区三区试看 | 在教室伦流澡到高潮hnp视频 | 色综合久久88色综合天天 | 亚洲国产av美女网站 | 国产凸凹视频一区二区 | 国産精品久久久久久久 | 亚洲熟妇自偷自拍另类 | 99久久精品日本一区二区免费 | 男人的天堂av网站 | 欧美 日韩 人妻 高清 中文 | 国产综合色产在线精品 | 精品国产一区二区三区四区 | 学生妹亚洲一区二区 | 欧美熟妇另类久久久久久不卡 | 人妻体内射精一区二区三四 | 1000部啪啪未满十八勿入下载 | 国内精品久久久久久中文字幕 | 精品国产乱码久久久久乱码 | 国产乱子伦视频在线播放 | 麻豆国产人妻欲求不满 | 又大又硬又爽免费视频 | 成人女人看片免费视频放人 | 欧美午夜特黄aaaaaa片 | aa片在线观看视频在线播放 | 全黄性性激高免费视频 | 国内精品久久久久久中文字幕 | 国产精品久久久久久亚洲毛片 | 2020久久香蕉国产线看观看 | 国产精品高潮呻吟av久久 | 精品偷自拍另类在线观看 | 日本熟妇乱子伦xxxx | yw尤物av无码国产在线观看 | 国产人妻人伦精品 | 大色综合色综合网站 | 又色又爽又黄的美女裸体网站 | 国产人妻人伦精品1国产丝袜 | 成人精品天堂一区二区三区 | 国产av一区二区三区最新精品 | 国产深夜福利视频在线 | 奇米综合四色77777久久 东京无码熟妇人妻av在线网址 | 国产av无码专区亚洲a∨毛片 | 亚洲va欧美va天堂v国产综合 | 国产精品久久久久久亚洲影视内衣 | 国产超碰人人爽人人做人人添 | 亚洲成a人片在线观看无码3d | 老熟女重囗味hdxx69 | 国产精品人人爽人人做我的可爱 | 国产电影无码午夜在线播放 | 在线成人www免费观看视频 | 国产精品.xx视频.xxtv | 帮老师解开蕾丝奶罩吸乳网站 | 国精产品一区二区三区 | 台湾无码一区二区 | 国产精品人人爽人人做我的可爱 | 2019nv天堂香蕉在线观看 | 亚洲综合伊人久久大杳蕉 | 国产av一区二区三区最新精品 | 国产真实夫妇视频 | 国产人妻精品午夜福利免费 | 无码人妻精品一区二区三区下载 | 欧美成人免费全部网站 | 亚洲 欧美 激情 小说 另类 | 欧美放荡的少妇 | 国产片av国语在线观看 | 一本大道久久东京热无码av | 天堂久久天堂av色综合 | 青青草原综合久久大伊人精品 | 在线视频网站www色 | 欧美老人巨大xxxx做受 | 牲欲强的熟妇农村老妇女视频 | 一个人看的www免费视频在线观看 | 男人的天堂av网站 | 麻豆av传媒蜜桃天美传媒 | 欧洲熟妇精品视频 | 国产一区二区不卡老阿姨 | 国产午夜无码视频在线观看 | 夜先锋av资源网站 | 国产无遮挡吃胸膜奶免费看 | 玩弄少妇高潮ⅹxxxyw | 玩弄人妻少妇500系列视频 | 日韩精品无码一区二区中文字幕 | 真人与拘做受免费视频 | 人人妻人人澡人人爽精品欧美 | 无码免费一区二区三区 | 少女韩国电视剧在线观看完整 | 熟妇人妻无码xxx视频 | 99久久久无码国产精品免费 | 狠狠躁日日躁夜夜躁2020 | 亚洲经典千人经典日产 | 超碰97人人做人人爱少妇 | 日韩欧美群交p片內射中文 | 亚洲乱码国产乱码精品精 | 18禁黄网站男男禁片免费观看 | 四十如虎的丰满熟妇啪啪 | 国产乱人偷精品人妻a片 | 国产va免费精品观看 | 久久熟妇人妻午夜寂寞影院 | 98国产精品综合一区二区三区 | 丝袜足控一区二区三区 | 欧美人与善在线com | 大地资源中文第3页 | 中文字幕无码视频专区 | 亚洲阿v天堂在线 | 日本va欧美va欧美va精品 | 亚洲综合无码一区二区三区 | 动漫av一区二区在线观看 | 无码人妻丰满熟妇区毛片18 | 亚洲日本在线电影 | 性生交大片免费看女人按摩摩 | 精品欧洲av无码一区二区三区 | 免费无码一区二区三区蜜桃大 | 欧洲vodafone精品性 | 大色综合色综合网站 | 性啪啪chinese东北女人 | 四十如虎的丰满熟妇啪啪 | 欧美黑人巨大xxxxx | 黑人粗大猛烈进出高潮视频 | 久久久久国色av免费观看性色 | 日产国产精品亚洲系列 | 久久综合九色综合欧美狠狠 | 中文久久乱码一区二区 | 日韩精品久久久肉伦网站 | 国产精品久久久久久久影院 | 久久国产精品偷任你爽任你 | 久久久久久久人妻无码中文字幕爆 | 国产三级精品三级男人的天堂 | 乱人伦中文视频在线观看 | 精品水蜜桃久久久久久久 | 丰满少妇女裸体bbw | 97久久国产亚洲精品超碰热 | 偷窥日本少妇撒尿chinese | 国内精品一区二区三区不卡 | 超碰97人人做人人爱少妇 | 国产免费久久久久久无码 | 玩弄中年熟妇正在播放 | 东京一本一道一二三区 | 久久国产精品萌白酱免费 | 国产亚洲人成a在线v网站 | 国产电影无码午夜在线播放 | 蜜桃av抽搐高潮一区二区 | 欧美黑人巨大xxxxx | 国产色视频一区二区三区 | 欧美黑人乱大交 | 国产综合色产在线精品 | 国产精品.xx视频.xxtv | 狠狠色丁香久久婷婷综合五月 | 久久99精品久久久久久动态图 | 久在线观看福利视频 | 成年美女黄网站色大免费视频 | 国产sm调教视频在线观看 | 一二三四在线观看免费视频 | 亚洲人交乣女bbw | 2019午夜福利不卡片在线 | 精品欧美一区二区三区久久久 | 国产亚洲欧美日韩亚洲中文色 | 亚洲男人av天堂午夜在 | 国产在线精品一区二区高清不卡 | 人妻尝试又大又粗久久 | 熟女少妇人妻中文字幕 | 国产乱码精品一品二品 | 亚洲综合伊人久久大杳蕉 | 在线亚洲高清揄拍自拍一品区 | 中文字幕人成乱码熟女app | 国产亚洲精品久久久久久久久动漫 | 精品欧洲av无码一区二区三区 | 国产无套粉嫩白浆在线 | 日韩精品成人一区二区三区 | 亚洲色大成网站www | 久久人人爽人人人人片 | 性生交大片免费看l | 亚洲自偷自偷在线制服 | 亚洲国产欧美日韩精品一区二区三区 | 精品aⅴ一区二区三区 | 婷婷丁香五月天综合东京热 | 日韩精品乱码av一区二区 | 国产人妻精品一区二区三区不卡 | 天堂久久天堂av色综合 | 18无码粉嫩小泬无套在线观看 | 欧美日韩在线亚洲综合国产人 | 中文字幕无码av激情不卡 | 亚洲国产成人av在线观看 | 国产乱人伦av在线无码 | 性史性农村dvd毛片 | 国产精品手机免费 | 自拍偷自拍亚洲精品被多人伦好爽 | 人人爽人人澡人人高潮 | 999久久久国产精品消防器材 | 亚洲自偷精品视频自拍 | 色婷婷综合中文久久一本 | 国产亚洲美女精品久久久2020 | 丁香啪啪综合成人亚洲 | 久久99精品久久久久久动态图 | 久热国产vs视频在线观看 | 牲交欧美兽交欧美 | 精品久久综合1区2区3区激情 | 国产激情无码一区二区 | 一本色道婷婷久久欧美 | 无码一区二区三区在线 | 亚洲精品综合一区二区三区在线 | 亚洲精品久久久久avwww潮水 | 欧美 日韩 亚洲 在线 | 久久国产精品精品国产色婷婷 | 国产欧美亚洲精品a | 成人动漫在线观看 | 给我免费的视频在线观看 | 美女黄网站人色视频免费国产 | a国产一区二区免费入口 | 亚洲熟妇色xxxxx欧美老妇 | 欧美自拍另类欧美综合图片区 | 三级4级全黄60分钟 | 国产午夜手机精彩视频 | 亚洲国产午夜精品理论片 | 国产精华av午夜在线观看 | 麻豆国产丝袜白领秘书在线观看 | 日韩精品乱码av一区二区 | 桃花色综合影院 | 国产成人精品一区二区在线小狼 | 麻花豆传媒剧国产免费mv在线 | 暴力强奷在线播放无码 | 久久久久久久人妻无码中文字幕爆 | 欧美日韩人成综合在线播放 | 日韩在线不卡免费视频一区 | 日韩av无码中文无码电影 | 人妻天天爽夜夜爽一区二区 | 99麻豆久久久国产精品免费 | 国产亲子乱弄免费视频 | 国产精品嫩草久久久久 | 天海翼激烈高潮到腰振不止 | 亚洲 另类 在线 欧美 制服 | 玩弄中年熟妇正在播放 | 国内丰满熟女出轨videos | 中文字幕无码人妻少妇免费 | 中文字幕无码视频专区 | 亚洲色大成网站www | 九九综合va免费看 | 午夜无码人妻av大片色欲 | 国产成人精品一区二区在线小狼 | 亚洲天堂2017无码 | 丝袜人妻一区二区三区 | 亚洲无人区一区二区三区 | 男女下面进入的视频免费午夜 | 欧美性色19p | 国产熟妇另类久久久久 | 丰满岳乱妇在线观看中字无码 | 成人精品一区二区三区中文字幕 | 国产在线无码精品电影网 | 大地资源中文第3页 | 两性色午夜视频免费播放 | 色情久久久av熟女人妻网站 | 国产精品无码一区二区三区不卡 | 美女毛片一区二区三区四区 | 午夜男女很黄的视频 | 18禁黄网站男男禁片免费观看 | 国产极品美女高潮无套在线观看 | 狠狠色欧美亚洲狠狠色www | 国产成人无码午夜视频在线观看 | 青青青手机频在线观看 | 宝宝好涨水快流出来免费视频 | 兔费看少妇性l交大片免费 | 国产欧美亚洲精品a | 国产精品久久久午夜夜伦鲁鲁 | 亚洲gv猛男gv无码男同 | 国产精品久久久午夜夜伦鲁鲁 | 亚洲中文字幕乱码av波多ji | 国产真实伦对白全集 | 精品国精品国产自在久国产87 | 国内揄拍国内精品人妻 | 亚洲国产综合无码一区 | 亚洲自偷自拍另类第1页 | 免费观看激色视频网站 | 国产成人一区二区三区在线观看 | 免费视频欧美无人区码 | 亚洲中文字幕无码一久久区 | 377p欧洲日本亚洲大胆 | 日韩人妻无码中文字幕视频 | 精品aⅴ一区二区三区 | 日韩在线不卡免费视频一区 | 亚洲综合无码久久精品综合 | 国产熟女一区二区三区四区五区 | 在线视频网站www色 | 国产 精品 自在自线 | 亚洲一区二区三区在线观看网站 | 97se亚洲精品一区 | 色欲人妻aaaaaaa无码 | 在线播放亚洲第一字幕 | 色狠狠av一区二区三区 | 色欲久久久天天天综合网精品 | 精品人妻中文字幕有码在线 | 欧美第一黄网免费网站 | 扒开双腿吃奶呻吟做受视频 | 国产亚洲精品久久久闺蜜 | 国产口爆吞精在线视频 | 亚洲狠狠婷婷综合久久 | 又紧又大又爽精品一区二区 | 无码人妻黑人中文字幕 | 国产又爽又猛又粗的视频a片 | 欧美激情一区二区三区成人 | 成人无码视频免费播放 | 国产婷婷色一区二区三区在线 | 日本欧美一区二区三区乱码 | 伊人久久大香线蕉av一区二区 | 色情久久久av熟女人妻网站 | 中文久久乱码一区二区 | 久久综合久久自在自线精品自 | 国产精品久久久一区二区三区 | 天干天干啦夜天干天2017 | 欧美自拍另类欧美综合图片区 | 亚洲人成无码网www | 最近中文2019字幕第二页 | 日日鲁鲁鲁夜夜爽爽狠狠 | 中文字幕精品av一区二区五区 | 成人亚洲精品久久久久 | 亚洲日韩av一区二区三区四区 | 亚洲の无码国产の无码影院 | 亚洲日韩av一区二区三区中文 | 日本va欧美va欧美va精品 | 2020久久香蕉国产线看观看 | 18无码粉嫩小泬无套在线观看 | 西西人体www44rt大胆高清 | 人人妻人人澡人人爽人人精品浪潮 | 国产人妻久久精品二区三区老狼 | 女人被男人躁得好爽免费视频 | 亚洲一区二区三区无码久久 | 老头边吃奶边弄进去呻吟 | 奇米影视888欧美在线观看 | 内射后入在线观看一区 | 男人的天堂2018无码 | av人摸人人人澡人人超碰下载 | 国内少妇偷人精品视频免费 | 亚洲精品成人福利网站 | 色婷婷久久一区二区三区麻豆 | 久激情内射婷内射蜜桃人妖 | 国产成人无码区免费内射一片色欲 | 国产美女精品一区二区三区 | 国内精品人妻无码久久久影院蜜桃 | 国产又爽又猛又粗的视频a片 | 亚无码乱人伦一区二区 | 亚洲人成网站在线播放942 | 国产人妻精品一区二区三区不卡 | 狠狠色欧美亚洲狠狠色www | 中国女人内谢69xxxx | 日韩av无码一区二区三区不卡 | 久久熟妇人妻午夜寂寞影院 | 国产精品18久久久久久麻辣 | 日本精品久久久久中文字幕 | √8天堂资源地址中文在线 | 亚洲中文字幕无码中字 | 色综合久久中文娱乐网 | 无码午夜成人1000部免费视频 | 久久成人a毛片免费观看网站 | 亚洲中文字幕久久无码 | 久久国产36精品色熟妇 | 亚洲精品欧美二区三区中文字幕 | 午夜男女很黄的视频 | 亚洲精品无码国产 | 国产真人无遮挡作爱免费视频 | 1000部夫妻午夜免费 | 性欧美熟妇videofreesex | 色婷婷综合激情综在线播放 | 天海翼激烈高潮到腰振不止 | 精品少妇爆乳无码av无码专区 | 精品亚洲韩国一区二区三区 | 国产精品多人p群无码 | 狠狠色欧美亚洲狠狠色www | 色综合久久久无码网中文 | 少妇高潮一区二区三区99 | 日韩精品a片一区二区三区妖精 | 伊人久久大香线蕉亚洲 | 国产另类ts人妖一区二区 | 中文字幕亚洲情99在线 | 人人妻人人澡人人爽人人精品浪潮 | 国产亚洲精品久久久久久久久动漫 | 成人无码视频免费播放 | 精品国产青草久久久久福利 | 国产成人精品无码播放 | 亚洲精品一区二区三区婷婷月 | 十八禁视频网站在线观看 | 日韩精品乱码av一区二区 | 成人精品视频一区二区 | 香港三级日本三级妇三级 | 亚洲精品中文字幕久久久久 | 国产情侣作爱视频免费观看 | 日本精品久久久久中文字幕 | 久9re热视频这里只有精品 | 亚洲の无码国产の无码影院 | 欧洲美熟女乱又伦 | 性欧美牲交xxxxx视频 | 极品嫩模高潮叫床 | 中文精品无码中文字幕无码专区 | 国产真人无遮挡作爱免费视频 | 国产精品久久久av久久久 | 久久亚洲日韩精品一区二区三区 | 久久精品中文字幕大胸 | 99久久精品无码一区二区毛片 | 中文无码成人免费视频在线观看 | 国产精华av午夜在线观看 | 爽爽影院免费观看 | 亚洲中文字幕久久无码 | 久久久精品国产sm最大网站 | 四十如虎的丰满熟妇啪啪 | 亚洲色无码一区二区三区 | 国产精品无码一区二区桃花视频 | 精品国产乱码久久久久乱码 | 精品少妇爆乳无码av无码专区 | 日日碰狠狠丁香久燥 | 在线精品国产一区二区三区 | 图片区 小说区 区 亚洲五月 | 98国产精品综合一区二区三区 | 无码国内精品人妻少妇 | 中文字幕无码av激情不卡 | 久久精品国产99精品亚洲 | 国产精品久久久av久久久 | 又大又硬又爽免费视频 | 老熟女乱子伦 | 成人精品天堂一区二区三区 | 啦啦啦www在线观看免费视频 | 国产9 9在线 | 中文 | 国产熟妇高潮叫床视频播放 | 人妻aⅴ无码一区二区三区 | 狠狠色噜噜狠狠狠7777奇米 | 青春草在线视频免费观看 | 国产熟女一区二区三区四区五区 | 黑人大群体交免费视频 | 亚洲国产综合无码一区 | 18黄暴禁片在线观看 | 18禁黄网站男男禁片免费观看 | 久久99精品久久久久婷婷 | 一本久道久久综合婷婷五月 | 国产精品福利视频导航 | 中文字幕久久久久人妻 | 色婷婷综合中文久久一本 | 亚洲阿v天堂在线 | 成在人线av无码免费 | 日本丰满熟妇videos | 真人与拘做受免费视频一 | 国产亚av手机在线观看 | 中文字幕日产无线码一区 | 宝宝好涨水快流出来免费视频 | 国产综合在线观看 | 国产亚洲精品久久久久久大师 | 免费无码午夜福利片69 | 成年美女黄网站色大免费全看 | 黑人巨大精品欧美黑寡妇 | 国内少妇偷人精品视频免费 | 色一情一乱一伦一视频免费看 | 欧美一区二区三区 | 3d动漫精品啪啪一区二区中 | 亚洲色欲色欲欲www在线 | 欧美丰满熟妇xxxx | 国产成人无码区免费内射一片色欲 | 亚洲成a人片在线观看无码 | 久久精品丝袜高跟鞋 | 亚洲 日韩 欧美 成人 在线观看 | 亚洲 高清 成人 动漫 | 精品久久久久久亚洲精品 | 国产在线精品一区二区三区直播 | 亚洲欧美日韩成人高清在线一区 | 欧洲精品码一区二区三区免费看 | 久久久久久亚洲精品a片成人 | 欧美xxxx黑人又粗又长 | 麻豆md0077饥渴少妇 | 成人片黄网站色大片免费观看 | 亚洲综合伊人久久大杳蕉 | 亚洲日韩av一区二区三区中文 | 午夜熟女插插xx免费视频 | 国产99久久精品一区二区 | 亚洲精品一区国产 | 久久久婷婷五月亚洲97号色 | 全黄性性激高免费视频 | 欧美丰满少妇xxxx性 | 丰腴饱满的极品熟妇 | av人摸人人人澡人人超碰下载 | 一本大道伊人av久久综合 | 亚洲阿v天堂在线 | 51国偷自产一区二区三区 | 久久久久成人片免费观看蜜芽 | 玩弄人妻少妇500系列视频 | 东京无码熟妇人妻av在线网址 | 国产精品毛片一区二区 | 婷婷五月综合激情中文字幕 | 亚洲人成网站在线播放942 | 国产在线精品一区二区高清不卡 | 成人免费视频一区二区 | 亚洲精品一区国产 | 国产成人精品必看 | 日韩 欧美 动漫 国产 制服 | 中文字幕无码免费久久9一区9 | 天天躁日日躁狠狠躁免费麻豆 | 亚洲精品一区二区三区四区五区 | 小泽玛莉亚一区二区视频在线 | aⅴ亚洲 日韩 色 图网站 播放 | 东京热无码av男人的天堂 | 国产在线aaa片一区二区99 | 九九热爱视频精品 | 日韩 欧美 动漫 国产 制服 | 欧美丰满少妇xxxx性 | 国产sm调教视频在线观看 | 人妻插b视频一区二区三区 | 成人性做爰aaa片免费看 | 亚洲欧洲日本无在线码 | 免费中文字幕日韩欧美 | 中文字幕无码av激情不卡 | 男人的天堂av网站 | 精品欧洲av无码一区二区三区 | 又大又硬又黄的免费视频 | 丰满少妇人妻久久久久久 | a在线观看免费网站大全 | 国产成人无码a区在线观看视频app | 天堂亚洲免费视频 | 麻豆国产丝袜白领秘书在线观看 | 无码人妻精品一区二区三区不卡 | 久久久亚洲欧洲日产国码αv | 又粗又大又硬毛片免费看 | 国产卡一卡二卡三 | 精品无码成人片一区二区98 | 国产亚洲欧美日韩亚洲中文色 | 亚洲成熟女人毛毛耸耸多 | 亚洲中文字幕无码中字 | 国内精品久久久久久中文字幕 | 乱人伦人妻中文字幕无码久久网 | 国产乱码精品一品二品 | 国产精品福利视频导航 | 一本久久a久久精品vr综合 | 国产 浪潮av性色四虎 | 免费人成在线观看网站 | 动漫av一区二区在线观看 | 亚洲の无码国产の无码步美 | 成人动漫在线观看 | 欧美老熟妇乱xxxxx | 日本精品人妻无码免费大全 | 欧美精品国产综合久久 | 丝袜人妻一区二区三区 | 国产亚洲欧美日韩亚洲中文色 | 国产成人综合色在线观看网站 | 亚洲精品久久久久中文第一幕 | 色婷婷av一区二区三区之红樱桃 | 中文字幕人妻丝袜二区 | 日日鲁鲁鲁夜夜爽爽狠狠 | 搡女人真爽免费视频大全 | 国产艳妇av在线观看果冻传媒 | 久久精品中文字幕大胸 | 无码国内精品人妻少妇 | av香港经典三级级 在线 | 1000部夫妻午夜免费 | 成人综合网亚洲伊人 | 人妻人人添人妻人人爱 | 国产在线一区二区三区四区五区 | 精品无码国产一区二区三区av | 人人爽人人澡人人人妻 | 亚洲国产精品久久久天堂 | 亚洲色偷偷偷综合网 | 少妇邻居内射在线 | 蜜臀aⅴ国产精品久久久国产老师 | 欧美日韩亚洲国产精品 | 国产人妻精品午夜福利免费 | 亚洲中文字幕无码一久久区 | 国产人妻久久精品二区三区老狼 | 国产农村乱对白刺激视频 | 中文无码成人免费视频在线观看 | 精品国精品国产自在久国产87 | 中文字幕av无码一区二区三区电影 | 国产精品久久久久久久影院 | 国产日产欧产精品精品app | 国产午夜无码视频在线观看 | 十八禁真人啪啪免费网站 | 国产精品视频免费播放 | 国产精华av午夜在线观看 | 久久综合狠狠综合久久综合88 | 亚洲中文字幕在线无码一区二区 | 亚洲中文字幕无码中字 | 亚洲 a v无 码免 费 成 人 a v | 给我免费的视频在线观看 | 好男人社区资源 | 久久久久av无码免费网 | 精品欧美一区二区三区久久久 | 高清国产亚洲精品自在久久 | 夫妻免费无码v看片 | 精品无码国产自产拍在线观看蜜 | 久久这里只有精品视频9 | 国产成人无码av片在线观看不卡 | 装睡被陌生人摸出水好爽 | 丝袜 中出 制服 人妻 美腿 | 国产乱人伦av在线无码 | 日韩欧美中文字幕在线三区 | 国精产品一区二区三区 | 日日麻批免费40分钟无码 | 亚洲成熟女人毛毛耸耸多 | 少妇久久久久久人妻无码 | 久久国产精品萌白酱免费 | 久久精品国产精品国产精品污 | 亚洲人成网站在线播放942 | 亚洲精品欧美二区三区中文字幕 | 亚洲码国产精品高潮在线 | 对白脏话肉麻粗话av | 老子影院午夜精品无码 | 人妻少妇精品无码专区二区 | 天天拍夜夜添久久精品 | 国产精品内射视频免费 | 亚洲欧美日韩综合久久久 | 国产午夜手机精彩视频 | 亚洲 日韩 欧美 成人 在线观看 | 国产精品18久久久久久麻辣 | 国产国产精品人在线视 | 免费无码肉片在线观看 | 强辱丰满人妻hd中文字幕 | 在线播放无码字幕亚洲 | 人妻有码中文字幕在线 | 久久伊人色av天堂九九小黄鸭 | 精品日本一区二区三区在线观看 | 无码人妻黑人中文字幕 | 欧美一区二区三区视频在线观看 | 99精品无人区乱码1区2区3区 | 中文字幕人妻丝袜二区 | 日本在线高清不卡免费播放 | 国产一区二区不卡老阿姨 | 精品国产一区二区三区四区 | 国内老熟妇对白xxxxhd | 久久国产精品萌白酱免费 | 强辱丰满人妻hd中文字幕 | 高潮毛片无遮挡高清免费 | 国产无套内射久久久国产 | 中文字幕久久久久人妻 | 亚洲精品国偷拍自产在线麻豆 | 亚洲s码欧洲m码国产av | 国产香蕉尹人综合在线观看 | 国产成人无码午夜视频在线观看 | 日韩精品无码一区二区中文字幕 | 国产免费久久精品国产传媒 | 又湿又紧又大又爽a视频国产 | 亚洲乱码日产精品bd | 欧美大屁股xxxxhd黑色 | 人妻尝试又大又粗久久 | 无码毛片视频一区二区本码 | 乱人伦人妻中文字幕无码久久网 | 精品成在人线av无码免费看 | 少妇人妻偷人精品无码视频 | 日本丰满护士爆乳xxxx | 久久久久久国产精品无码下载 | 国产激情艳情在线看视频 | 精品人妻人人做人人爽夜夜爽 | 樱花草在线播放免费中文 | 久久久久久亚洲精品a片成人 | 中文精品久久久久人妻不卡 | 亚洲成av人片天堂网无码】 | 人人超人人超碰超国产 | 成人欧美一区二区三区黑人 | 久久久久成人精品免费播放动漫 | 一区二区三区高清视频一 | 国产凸凹视频一区二区 | 夜夜影院未满十八勿进 | 波多野结衣aⅴ在线 | 波多野结衣高清一区二区三区 | 成年女人永久免费看片 | 中文字幕 人妻熟女 | 国产亚洲精品久久久久久久久动漫 | 99久久精品日本一区二区免费 | 国产亚洲精品久久久闺蜜 | 日韩人妻少妇一区二区三区 | 丰满少妇弄高潮了www | 中文字幕无码日韩欧毛 | 欧美激情综合亚洲一二区 | 中文字幕无码日韩欧毛 | 丰满妇女强制高潮18xxxx | 永久黄网站色视频免费直播 | 亚洲成熟女人毛毛耸耸多 | 日韩人妻无码一区二区三区久久99 | 国产精品久久久久久亚洲影视内衣 | 欧美日韩久久久精品a片 | 久久精品女人的天堂av | 免费播放一区二区三区 | 色综合久久中文娱乐网 | 性欧美疯狂xxxxbbbb | 欧美精品国产综合久久 | 99久久精品日本一区二区免费 | 女人色极品影院 | 狠狠亚洲超碰狼人久久 | 久久久成人毛片无码 | 亚洲午夜久久久影院 | 天天综合网天天综合色 | 丰满少妇熟乱xxxxx视频 | 精品水蜜桃久久久久久久 | 成人无码视频免费播放 | 精品久久久无码中文字幕 | 成 人 免费观看网站 | 四虎国产精品一区二区 | 亚洲一区二区三区国产精华液 | 任你躁在线精品免费 | 97夜夜澡人人双人人人喊 | 国产激情无码一区二区app | 久久午夜无码鲁丝片午夜精品 | 99精品视频在线观看免费 | 精品人妻人人做人人爽夜夜爽 | 国产9 9在线 | 中文 | 成在人线av无码免观看麻豆 | √天堂资源地址中文在线 | 鲁鲁鲁爽爽爽在线视频观看 | 国産精品久久久久久久 | 99国产精品白浆在线观看免费 | 18黄暴禁片在线观看 | 精品偷自拍另类在线观看 | 亚洲中文字幕久久无码 | 老熟女重囗味hdxx69 | 国产午夜福利亚洲第一 | 少妇性俱乐部纵欲狂欢电影 | 中文久久乱码一区二区 | 精品人妻中文字幕有码在线 | 精品少妇爆乳无码av无码专区 | 亚洲七七久久桃花影院 | 亚洲综合另类小说色区 | 国产激情艳情在线看视频 | 亚洲乱码国产乱码精品精 | 中文字幕无码人妻少妇免费 | 玩弄少妇高潮ⅹxxxyw | 国产亚洲美女精品久久久2020 | 国产日产欧产精品精品app | 国产成人一区二区三区别 | 国产av一区二区三区最新精品 | 日韩精品无码一本二本三本色 | 国产区女主播在线观看 | 久久综合给合久久狠狠狠97色 | 久久精品女人的天堂av | 国产农村妇女aaaaa视频 撕开奶罩揉吮奶头视频 | 国产小呦泬泬99精品 | 欧美丰满老熟妇xxxxx性 | 精品无码一区二区三区爱欲 | 久久精品99久久香蕉国产色戒 | 国产片av国语在线观看 | 久久久精品人妻久久影视 | 亚洲综合久久一区二区 | 亚洲码国产精品高潮在线 | 日韩人妻无码一区二区三区久久99 | 国产成人精品视频ⅴa片软件竹菊 | 伊人久久大香线焦av综合影院 | 国产无遮挡又黄又爽免费视频 | 老司机亚洲精品影院 | 少妇厨房愉情理9仑片视频 | 亚洲gv猛男gv无码男同 | 欧美一区二区三区 | 国产特级毛片aaaaaa高潮流水 | 精品无人区无码乱码毛片国产 | 亚洲欧美中文字幕5发布 | 无码毛片视频一区二区本码 | 国模大胆一区二区三区 | 日韩精品无码免费一区二区三区 | 午夜成人1000部免费视频 | 久久精品成人欧美大片 | 高清不卡一区二区三区 | 色婷婷香蕉在线一区二区 | 1000部夫妻午夜免费 | 日韩精品乱码av一区二区 | 久久伊人色av天堂九九小黄鸭 | 又大又黄又粗又爽的免费视频 | 强奷人妻日本中文字幕 | 欧美老熟妇乱xxxxx | 欧美性猛交xxxx富婆 | 成在人线av无码免费 | 亚洲 高清 成人 动漫 | 久久人人爽人人爽人人片av高清 | 亚洲日本一区二区三区在线 | 色婷婷香蕉在线一区二区 | 巨爆乳无码视频在线观看 | 欧美精品国产综合久久 | 老子影院午夜精品无码 | 国产精品亚洲综合色区韩国 | 欧美激情综合亚洲一二区 | 国产亲子乱弄免费视频 | 人人妻人人澡人人爽人人精品浪潮 | 中文字幕日产无线码一区 | 99久久久国产精品无码免费 | 久久精品中文字幕大胸 | 美女黄网站人色视频免费国产 | 国产疯狂伦交大片 | 国产一区二区三区四区五区加勒比 | 婷婷五月综合激情中文字幕 | 成年美女黄网站色大免费视频 | 国产明星裸体无码xxxx视频 | 在线观看国产一区二区三区 | 精品久久久久久人妻无码中文字幕 | 娇妻被黑人粗大高潮白浆 | 久久精品无码一区二区三区 | 亚洲欧美综合区丁香五月小说 | 免费国产黄网站在线观看 | 国产福利视频一区二区 | 一区二区三区高清视频一 | 国产黄在线观看免费观看不卡 | 国产激情综合五月久久 | 欧美高清在线精品一区 | 精品少妇爆乳无码av无码专区 | 国产成人综合在线女婷五月99播放 | 亚洲小说春色综合另类 | 国产偷自视频区视频 | 成人女人看片免费视频放人 | 精品无人国产偷自产在线 | 老熟妇仑乱视频一区二区 | 人人爽人人爽人人片av亚洲 | 亚洲国产精品无码久久久久高潮 | 成人性做爰aaa片免费看不忠 | 强伦人妻一区二区三区视频18 | 18无码粉嫩小泬无套在线观看 | 日日天干夜夜狠狠爱 | 亚洲日韩乱码中文无码蜜桃臀网站 | 好男人社区资源 | 狠狠亚洲超碰狼人久久 |