精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

C++ 單一定義原則 (ODR):90% 程序員踩過的坑都在這里

開發
單一定義原則并非一個孤立的語言特性,而是貫穿于 C++ 編譯、鏈接和運行過程中的核心規則,深刻影響著代碼的組織、庫的設計以及程序的正確性與健壯性。

在 C++ 語言中,單一定義原則(One Definition Rule, ODR)是其最為重要的基石之一。它并非一個孤立的語言特性,而是貫穿于 C++ 編譯、鏈接和運行過程中的核心規則,深刻影響著代碼的組織、庫的設計以及程序的正確性與健壯性。

一、什么是單一定義原則 (ODR)?

C++ 標準 ODR 核心思想可以概括為以下兩個主要方面:

  • 第一:對于非內聯函數和變量 : 在整個程序(所有鏈接在一起的翻譯單元)中,每一個被 ODR-used (大致可以理解為"被使用且需要其定義") 的非內聯函數或變量,都必須有且僅有一個定義。

強調的是整個程序所有翻譯單元只有一個定義!

這一部分主要關注那些默認具有外部鏈接性且不允許重復定義的實體,由鏈接器強制執行,違規通常導致鏈接錯誤。

  • 第二:對于類類型 (class types)、枚舉類型 (enum types)、模板 (templates)、內聯函數 (inline functions) 和內聯變量 (inline variables, C++17 起): 在使用它們的每一個翻譯單元中,都必須有且僅有一個定義。并且,這些在不同翻譯單元中出現的定義必須是完全相同的。

強調的是每一個翻譯單元只有一個定義!

這一部分主要關注那些定義需要在多個地方可見(通常放在頭文件里)的實體,要求每個使用的 TU 有定義,且所有定義必須一致。違規通常導致運行時 UB,而不是鏈接錯誤。這個無法由鏈接器檢查(內聯函數/類的定義可能已內聯展開,無顯式符號)。是編譯器層面的規則,確保類、模板等的定義在所有 TU 中完全一致,否則會導致隱蔽的運行時錯誤(UB)

這里有幾個關鍵概念:

1. 定義  vs  聲明 :

(1) 聲明 

引入一個名字及其類型,告訴編譯器這個東西存在,但不必說明它的具體實現或內存布局。

例如:

extern int count;
void printMessage(const std::string& msg);
class MyClass;

(2) 定義 

提供了該名字的具體實現或完整的內存布局信息。它會分配存儲空間(對于變量)或提供函數體(對于函數)或完整的類/枚舉/模板結構。

例如:

int count = 0;
void printMessage(const std::string& msg) { /* ... implementation ... */ }
class MyClass { int data; public: void method(); };。

(3) 翻譯單元 (Translation Unit, TU):

一個 .cpp 源文件以及它 #include 的所有頭文件,在經過預處理器處理后形成的代碼單元。編譯器獨立地編譯每個翻譯單元,生成目標文件 (.o 或 .obj)。

(4) 鏈接器 (Linker): 

將多個目標文件以及所需的庫文件組合起來,解析外部引用,最終生成可執行文件或共享庫。ODR 的第一部分(非內聯函數/變量)主要由鏈接器強制執行。

(5) ODR-used:

一個實體(變量、函數等)被 ODR-used 通常意味著程序需要知道它的定義。

例如,調用一個非內聯函數、讀取或寫入一個變量的值(非 decltype 等情況)、需要知道一個類的完整定義來創建對象或訪問成員等。

??根據 C++標準,ODR-used 的正式定義包括:變量被引用、函數被調用、類被實例化、或需要其完整類型信息(如對象構造、成員訪問

二、ODR 的重要性:為何必須遵守?

ODR 不是 C++ 設計者為了增加復雜度而設定的規則,它是保證程序正確性和一致性的必要條件:

(1) 防止鏈接時歧義:

如果同一個非內聯函數或全局變量在多個翻譯單元中都有定義,鏈接器將無法確定使用哪個定義,導致"multiple definition"鏈接錯誤。這是最直接、最常見的 ODR 違規表現。

(2) 保證行為一致性: 

對于類、模板、內聯函數等,如果它們在不同的翻譯單元中有不同的定義(即使編譯器沒有報錯),程序行為將變得不可預測(Undefined Behavior, UB)。想象一下,同一個類的對象在程序的某個部分有一個成員變量,而在另一部分卻沒有,或者同一個內聯函數在不同地方執行不同的邏輯,這將導致災難性的運行時錯誤,且極難調試。

(3) 確保 ABI 兼容性:

在庫開發中,遵循 ODR 對于維持應用程序二進制接口(ABI)的穩定至關重要。如果庫的不同版本對同一類型或內聯函數的定義不一致,依賴該庫的應用程序可能會在更新庫后崩潰。

三、常見的 ODR 違規場景及規避方法

1. 場景一:在頭文件中定義非內聯函數或變量

這是初學者最常犯的錯誤。

// common.h
#ifndef COMMON_H
#define COMMON_H

#include <string>
#include <iostream>

// 錯誤:在頭文件中定義非內聯全局變量
int global_counter = 0; // ODR Violation!

// 錯誤:在頭文件中定義非內聯函數
void logMessage(const std::string& msg) { // ODR Violation!
    std::cout << "[LOG] " << msg << std::endl;
}

#endif // COMMON_H

// a.cpp
#include "common.h"
void func_a() { global_counter++; logMessage("Called from A"); }

// b.cpp
#include "common.h"
void func_b() { global_counter--; logMessage("Called from B"); }

// main.cpp
#include "common.h"
extern void func_a();
extern void func_b();
int main() {
    func_a();
    func_b();
    logMessage("Final count: " + std::to_string(global_counter));
    return0;
}

當 a.cpp, b.cpp, main.cpp 分別編譯時,每個目標文件都會包含 global_counter 和 logMessage 的一份定義。鏈接器在合并這些目標文件時,會發現多個同名全局符號的定義,從而報錯。

規避方法:

  • 對于變量: 在頭文件中使用 extern 進行聲明,并在唯一一個源文件 (.cpp) 中進行定義。(C++17 開始可以使用 inline 變量方法代替,這里主要講 ODR。
// common.h
extern int global_counter; // Declaration
void logMessage(const std::string& msg); // Declaration

// common.cpp
#include "common.h"
#include <iostream>
int global_counter = 0; // Definition
void logMessage(const std::string& msg) { // Definition
    std::cout << "[LOG] " << msg << std::endl;
}
  • 對于函數: 同樣地,在頭文件中聲明,在唯一一個源文件中定義?;蛘撸绻瘮颠壿嫼唵吻蚁M幾g器優化調用(內聯展開),可以將其聲明為 inline 函數,定義仍在頭文件中。
// common.h
#include <string>
#include <iostream>

inline void logMessageInline(const std::string& msg) { // Inline definition in header is OK
    std::cout << "[LOG-INLINE] " << msg << std::endl;
}

注意:即使是 inline 函數,其定義在所有使用它的 TU 中也必須完全相同。

2. 場景二:類型、模板、內聯函數/變量定義不一致

這種情況比鏈接錯誤更隱蔽,可能導致運行時 UB。

// config.h
#ifdef USE_FLAG_X
struct AppConfig {
    int version = 2;
    bool flag= true;
};
#else
struct AppConfig {
    int version = 1;
};
#endif

// a.cpp (編譯時定義了 USE_FLAG_X)
// g++ -D USE_FLAG_X a.cpp ...
#include "config.h"
#include <iostream>
void process_a(const AppConfig& config) {
    std::cout << "A: Version " << config.version;
    if (config.flag) { // ODR Violation may occur here
        std::cout << ", Flag X enabled" << std::endl;
    } else {
        std::cout << std::endl;
    }
}

// b.cpp (編譯時未定義 USE_FLAG_X)
// g++ b.cpp ...
#include "config.h"
#include <iostream>
AppConfig global_config_b; // Uses definition without flag
extern void process_a(const AppConfig& config);
void func_b() {
    process_a(global_config_b); // Passing AppConfig defined differently! UB!
}

在這個例子中,AppConfig 類型在 a.cpp 和 b.cpp 中有不同的定義(成員不同)。當 func_b 調用 process_a 時,傳遞的 AppConfig 對象(由 b.cpp 的定義創建)與 process_a 函數期望接收的 AppConfig(由 a.cpp 的定義確定)布局可能不一致。process_a 訪問 config.flag時,訪問的是無效內存,導致未定義行為。鏈接器通常無法檢測到這種類型的 ODR 違規。

規避方法:

(1) 保持定義一致: 

確保所有需要共享的類型、模板、內聯函數/變量的定義在所有 TU 中都是詞法上相同的。

(2) 將定義放在頭文件中: 

這是最常用的方法。將類、模板、內聯函數/變量的定義放在頭文件中,所有類內定義的成員函數默認具有 inline 屬性。inline 關鍵字在類內定義主要影響的是 ODR 規則的應用方式(允許在頭文件中定義并在多處出現),而不是改變其基本的外部鏈接屬性。

通過 #include 確保所有 TU 使用同一份定義。

(33) 使用 #pragma once 或 include guards: 防止頭文件被重復包含,確保每個 TU 只處理一次定義。

避免在頭文件中使用條件編譯 (#ifdef) 改變定義:如果需要配置,應通過其他方式(如運行時配置、模板參數、不同的類等)實現,而不是在同一個類型的定義上做條件編譯。

(4) 小心匿名命名空間:

// header.h
namespace { // Anonymous namespace in a header file! Bad idea!
    struct Helper { int val = 42; }; // Definition has internal linkage
    void helperFunc() { /* ... */ } // Definition has internal linkage
}

// a.cpp
#include "header.h"
void use_a() { Helper h; /* ... */ } // Uses a.cpp's unique copy of Helper

// b.cpp
#include "header.h"
void use_b() { Helper h; /* ... */ } // Uses b.cpp's unique copy of Helper

雖然這不會導致鏈接錯誤(因為匿名命名空間中的實體具有內部鏈接,對鏈接器不可見),但它違反了 ODR 的第二部分(類型定義需一致)。每個包含 header.h 的 .cpp 文件都會有自己獨立的一套 Helper 類型和 helperFunc 函數。如果這些類型或函數需要跨 TU 交互(例如,通過指針或引用傳遞),就會出現問題。

如果在頭文件中使用匿名命名空間定義了一個類型T,然后在多個.cpp文件中都包含了這個頭文件,那么每個.cpp文件實際上都擁有了一個獨立的、具有內部鏈接的T類型定義

結論:

  • 不要在頭文件中使用匿名命名空間來定義需要在多個 TU 間共享的類型或函數。
  • 頭文件中的匿名命名空間不會導致 ODR 違規,但可能導致跨 TU 的類型混淆問題, 匿名命名空間主要用于 .cpp 文件內部,隱藏實現細節,避免名稱沖突。

四、總結

(1) 清晰區分聲明與定義: 時刻牢記兩者的區別及其對 ODR 的影響。

(2) 擁抱"頭文件放聲明和接口,源文件放實現"的模式: 這是管理 ODR 的最基本也是最有效的方法。(C++17 后使用 inline 變量)

(3) 謹慎在頭文件中放置定義: 只有類、枚舉、模板、inline 函數/變量的定義才適合放在頭文件中,且必須保證其在所有 TU 中的一致性。絕不在頭文件中定義非 inline 的函數或變量。

(4) 善用 inline關鍵字:對于短小、頻繁調用的函數,可以考慮 inline 并將其定義放在頭文件中,但這需要保證定義的一致性。

(5) 利用匿名命名空間或 static(用于內部鏈接): 在 .cpp 文件中隱藏實現細節,避免不必要的全局符號和 ODR 問題。

(6) 注意條件編譯: 避免使用 #ifdef 等宏在頭文件中改變類、模板、內聯函數的定義,這極易引入難以發現的 ODR 違規和 UB。

責任編輯:趙寧寧 來源: CppPlayer
相關推薦

2021-01-15 09:40:37

程序員技能開發者

2025-05-16 09:34:10

2025-05-21 10:10:00

C++內存泄漏開發

2024-07-02 11:16:21

2017-10-24 14:57:58

AI人工智能機器學習

2018-04-26 16:15:02

數據庫MySQLMySQL 8.0

2021-07-01 09:00:00

安全數字化轉型滲透

2018-03-19 14:43:28

2025-04-29 08:30:00

迭代器失效C++編程

2025-04-03 12:30:00

C 語言隱式類型轉換代碼

2021-12-09 08:16:40

JVM參數系統

2019-11-04 09:07:48

DevOps互聯網IT

2023-09-11 08:51:23

LinkedList雙向鏈表線程

2021-06-17 13:40:47

區塊鏈比特幣公有鏈

2023-12-11 21:59:01

時序分析深度學習自回歸模型

2021-10-06 16:21:32

類型對象Typescript

2009-06-24 14:10:22

2022-11-28 08:44:46

死鎖面試線程

2017-12-23 14:55:14

Java語言編程

2019-12-04 07:57:22

6G5G網絡
點贊
收藏

51CTO技術棧公眾號

欧美国产日韩精品免费观看| 麻豆一区二区三| 亚洲国产精品久久91精品| 91好吊色国产欧美日韩在线| 国产精品毛片一区二区三区四区| 久久精品久久综合| 高清在线视频日韩欧美| 级毛片内射视频| 涩涩屋成人免费视频软件| 精品久久久中文| 亚洲精品一区二区三区四区五区| 亚洲福利在线观看视频| 久久一区二区三区四区五区 | 亚洲av无码片一区二区三区 | 中文字幕一区视频| 精品久久久久久综合日本| 在线观看免费观看在线| 亚洲日本欧美| 啊v视频在线一区二区三区| 国产高潮视频在线观看| 狂野欧美性猛交xxxx| 亚洲成人黄色影院| 欧洲金发美女大战黑人| 免费在线超碰| 成人h动漫精品一区二区| 国产精品精品视频一区二区三区| 精品在线视频观看| 亚洲电影在线一区二区三区| 亚洲人成自拍网站| 中文字幕乱视频| 精品欧美视频| 欧美亚洲国产一区二区三区va| www.夜夜爱| av大大超碰在线| 国产日韩欧美精品综合| 久精品国产欧美| 三级小视频在线观看| 狠狠色狠狠色综合系列| 国产精品永久免费视频| 国产一区二区视频免费| 午夜一区在线| 91精品国产亚洲| 日本一区二区不卡在线| 欧美日韩精品免费观看视频完整| www.欧美精品| 美国一级片在线观看| 成人3d精品动漫精品一二三| 亚洲欧美激情精品一区二区| 97人妻精品一区二区三区免 | 日本成人在线视频网站| 日本中文字幕久久看| wwwxxx亚洲| 国产精品久久久久久模特 | 国产在线精品一区二区夜色 | 欧美三级电影在线| 日韩av在线不卡| 网站免费在线观看| 日韩av字幕| 日韩精品视频在线播放| 黄色工厂在线观看| 精品一区二区三区在线| 国产一区二区三区在线免费观看 | 国产裸体永久免费无遮挡| 久久99精品视频| 亚洲tv在线观看| 成人福利小视频| 成人精品免费视频| 久久精品国产精品国产精品污| 天天干,夜夜爽| 久久日韩精品一区二区五区| 日本精品一区二区三区视频| 国产小视频福利在线| 国产精品久久久久久久久免费桃花 | 日本一区二区三区国色天香 | 色老头视频在线观看| 亚洲色图制服丝袜| 黄色激情在线视频| 黑人精品一区| 欧美日韩国产综合草草| 污污视频在线免费| 一区二区三区免费在线看| 亚洲精品动漫久久久久| 成人黄色免费网址| 中文字幕乱码亚洲无线精品一区| 欧美富婆性猛交| 亚洲GV成人无码久久精品| 美女www一区二区| 99re6在线| 青青九九免费视频在线| 国产精品麻豆一区二区| 国产精品久久久久久久久电影网| 涩涩涩在线视频| 欧美日韩国产高清一区二区| 欧美性受xxxx黒人xyx性爽| 狠狠久久伊人| 影音先锋欧美精品| 久久久久久久久久综合| 日日欢夜夜爽一区| 国产精品国产精品| 福利在线播放| 亚洲国产精品一区二区www| 中国丰满人妻videoshd | 国产精华一区| www.视频在线.com| 午夜精品福利在线| 又色又爽又黄视频| 亚洲丝袜啪啪| 久久91精品国产91久久久| 免费视频网站在线观看入口| 国产成人亚洲综合a∨猫咪| 奇米影视首页 狠狠色丁香婷婷久久综合| 国产精品剧情一区二区在线观看| 欧美日韩精品在线播放| 久久精品无码一区二区三区毛片| 一本色道久久综合亚洲精品酒店 | 日韩福利在线播放| 美女福利视频在线观看| 石原莉奈在线亚洲二区| 国产色综合一区二区三区| 日本三级在线播放完整版| 色综合天天综合| 日批在线观看视频| 欧美激情91| 91欧美激情另类亚洲| 大片免费播放在线视频| 偷拍一区二区三区| 成人在线观看一区二区| 亚洲综合色网| 成人观看高清在线观看免费| 黄上黄在线观看| 午夜精品久久久久久久99水蜜桃 | 国产精品乱码久久久| 国产日韩精品久久久| 国产中文字幕免费观看| 7777精品| 欧美国产极速在线| 国产suv精品一区二区69| 国产精品久久久久久久久动漫 | 免费看一级一片| 精品一区二区三区免费观看| 日韩伦理一区二区三区av在线| 看黄在线观看| 日韩精品在线电影| 国产精品久久久久久99| 成人国产亚洲欧美成人综合网| 无码人妻aⅴ一区二区三区日本| 亚洲免费资源| 日韩在线观看免费av| 一起草av在线| 亚洲欧美一区二区三区久本道91| 日本美女视频一区| 久久精品欧美一区| 亚洲精品日韩av| 91精选在线| 精品国产91亚洲一区二区三区婷婷| 欧美在线视频第一页| 国产成人av一区二区三区在线| 日本久久高清视频| 8848成人影院| 8x拔播拔播x8国产精品| 深夜影院在线观看| 在线观看91精品国产入口| 国产熟女一区二区| 精品亚洲免费视频| 日韩精品第1页| 超碰成人免费| 4438全国成人免费| 国产www.大片在线| 91麻豆精品国产自产在线| 无码人妻精品一区二区三区夜夜嗨| 国产综合久久久久影院| 成人在线播放网址| 免费电影一区二区三区| 国产精品久久久久久久9999| 精品国产白色丝袜高跟鞋| 欧美一级久久久| 亚洲精品视频在线观看免费视频| 99久久99久久精品国产片果冻| 日韩视频免费在线播放| 我不卡手机影院| 国产区一区二区三区| 美脚恋feet久草欧美| www.久久久久| 深夜福利在线看| 欧美精品成人一区二区三区四区| 澳门黄色一级片| www久久精品| 亚洲18在线看污www麻豆 | 男人透女人免费视频| 欧美顶级大胆免费视频| 国产精品18毛片一区二区| 欧洲一级精品| 欧美精品在线网站| 极品美乳网红视频免费在线观看| 91精品国产综合久久久久久久| 日本熟女一区二区| 中文乱码免费一区二区| 日本不卡视频一区| 精品一区二区三区视频| 每日在线更新av| 亚洲精品电影| 日韩一区二区三区资源| 一区二区三区视频播放| 国产精品美女999| 僵尸再翻生在线观看| 日韩在线观看你懂的| 五月天婷婷在线播放| 正在播放亚洲一区| 无码人妻精品一区二区50| 亚洲综合色婷婷| 国产精品久久久免费看| 91在线观看地址| 精品人妻无码中文字幕18禁| 日本不卡一区二区三区| 国产精品999视频| 欧美aa国产视频| 午夜精品一区二区三区在线观看 | 精品久久久久久综合日本欧美| 波多野结衣激情视频| 亚洲电影激情视频网站| 青青青在线免费观看| 国产精品天干天干在观线| 波多野结衣影院| 成人动漫一区二区| 欧美激情一区二区三区p站| 九九视频精品免费| 中文字幕天天干| 久久精品电影| 亚洲成人精品一区二区| av之家在线观看| 欧美激情aⅴ一区二区三区| 一区二区三区四区| 不卡一区综合视频| 欧美一二三四五区| 色天下一区二区三区| 国产精品区一区| gogo人体一区| 成人91视频| 1313精品午夜理伦电影| 99久久伊人精品影院| 国产色99精品9i| 91免费电影网站| 日韩国产大片| 91亚洲国产成人精品性色| 久久天天久久| 成人有码在线视频| 国产激情精品一区二区三区| 成人国产精品免费视频| 欧洲亚洲精品久久久久| 国产日韩精品电影| www.久久99| 成人18视频| 卡通动漫国产精品| 欧美日韩一区二区三区免费| 亚洲成aⅴ人片久久青草影院| 久久久久一区二区| 蜜桃成人av| 亚洲第一综合| 91视频精品| 国产精品啪啪啪视频| 欧美人成在线| 黄色av网址在线播放| 久久国产精品亚洲77777| 可以免费在线看黄的网站| 日韩精品成人一区二区三区| xxx国产在线观看| 韩日精品视频一区| 深田咏美中文字幕| 久久久国际精品| 国产三级aaa| 一区二区三区不卡视频在线观看 | 午夜婷婷国产麻豆精品| 毛片在线免费视频| 欧美午夜精品久久久久久孕妇| 在线观看一二三区| 日韩欧美在线不卡| 天天干,夜夜操| 日韩在线观看免费网站 | 国产suv精品一区二区三区88区| 日韩不卡视频在线观看| 91色视频在线观看| 日韩激情网站| 亚洲免费av网| 亚洲美女91| 国产免费又粗又猛又爽| 国产精品羞羞答答xxdd| 一级做a爰片毛片| 亚洲欧洲美洲综合色网| 国产一级做a爰片在线看免费| 一本久道中文字幕精品亚洲嫩| 国产又大又黑又粗| 亚洲精品国产精品国自产观看浪潮 | 欧美日韩免费一区二区| 色婷婷综合久色| 国产免费高清av| 亚洲日本欧美中文幕| av在线免费观看网址| 日本精品免费一区二区三区| 97色婷婷成人综合在线观看| 国产一区二区三区高清视频| 99久久99热这里只有精品| 亚洲 高清 成人 动漫| 国产毛片一区二区| 一道本在线观看| 亚洲资源中文字幕| 91亚洲视频在线观看| 日韩av在线影院| av在线免费网站| 国产精品欧美久久久| 欧美深夜视频| 国产1区2区3区中文字幕| 日本中文一区二区三区| 黄色网址在线视频| 亚洲欧美国产77777| 成人一二三四区| 亚洲精品久久久久久久久久久久久 | av在线播放不卡| 天天做夜夜爱爱爱| 欧美综合亚洲图片综合区| 日本精品久久久久久| 另类专区欧美制服同性| а√天堂资源国产精品| 裸体丰满少妇做受久久99精品| 好看的日韩av电影| 红桃视频一区二区三区免费| 日本一区二区成人| 欧美一区免费看| 日韩电影免费在线观看中文字幕| av网站网址在线观看| 91久久精品美女高潮| 精品精品99| 欧美激情精品久久久久久小说| www.欧美.com| 国产一级一级片| 欧美本精品男人aⅴ天堂| 国产美女在线观看| 亚洲free性xxxx护士白浆| 999久久久精品国产| 午夜激情av在线| 中文字幕av一区二区三区高| 中文字幕手机在线视频| 亚洲人成电影网站色xx| 欧美片第一页| 日本欧洲国产一区二区| 久久久久久9| 无码 人妻 在线 视频| 色偷偷久久人人79超碰人人澡| 国际av在线| 国产精品久久久久久久久久新婚| 国产九一精品| 2025韩国理伦片在线观看| 中文字幕精品在线不卡| 中文字幕在线观看视频一区| 中文字幕久热精品视频在线| 日本一区二区三区视频在线| 亚洲国产精品一区二区第一页| 欧美bbbbb| 午夜三级在线观看| 日韩一区二区免费电影| 香蕉成人app免费看片| 成人免费视频网站入口| 国产精品女主播一区二区三区| 短视频在线观看| 欧美中文字幕一区| 国产精品久久久久久福利| 亚洲iv一区二区三区| 亚洲人www| 人妻视频一区二区| 69p69国产精品| av在线加勒比| 欧美日韩国产一二| 久久99精品久久久| 精品视频一区二区在线观看| 亚洲国产成人av在线| 亚洲wwww| 福利网在线观看| 成人精品国产福利| 99re国产在线| 久久国产视频网站| 秋霞蜜臀av久久电影网免费| 精品久久久久久久无码| 亚洲蜜臀av乱码久久精品| 色婷婷在线视频| 国产精品久久久久91| 亚洲最大av| 亚洲一区二区观看| 欧美一区二区成人| 无码小电影在线观看网站免费 | 欧美激情一级片一区二区| 艳妇乳肉亭妇荡乳av| 欧美三级韩国三级日本一级| av毛片在线免费| 日韩经典在线视频| 成人永久看片免费视频天堂| 国产99免费视频| 欧美精品videofree1080p| 国产va免费精品观看精品视频| 亚洲精品在线网址| 色欧美片视频在线观看| 久久亚洲资源|