精品欧美一区二区三区在线观看 _久久久久国色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技術棧公眾號

国产一区二区三区成人| 欧亚乱熟女一区二区在线| 在线播放麻豆| 亚洲精品国产成人影院| 色一区在线观看| 亚洲一卡二卡三卡| www.中文字幕| 蜜桃久久av| 爽爽爽爽爽爽爽成人免费观看| 欧美激情成人网| 欧美一级视频免费| 亚洲三级电影在线观看| 亚洲男人av电影| 91性高潮久久久久久久| 超碰在线97国产| 国产精品不卡视频| 91社区国产高清| 日本一区二区免费在线观看| 精品欧美午夜寂寞影院| 天天影视涩香欲综合网| 亚洲精品美女久久7777777| 亚洲h视频在线观看| 日韩成人精品视频| 久久久久日韩精品久久久男男| 久久久久久久穴| 日韩av超清在线观看| 亚洲高清中文字幕| 在线视频不卡国产| 蜜桃成人在线视频| eeuss国产一区二区三区| 国产日韩欧美视频在线| 永久看片925tv| 欧美精品乱码| 亚洲男人天堂网| av电影在线播放| 中文字幕av网站| 亚洲久久一区二区| 久久久精品免费视频| 白白色免费视频| 欧美有码在线| 精品99一区二区| ass极品水嫩小美女ass| 96sao精品免费视频观看| 亚洲猫色日本管| 亚洲二区自拍| 大胆av不用播放器在线播放| 久久你懂得1024| 精品国产_亚洲人成在线| www日本在线| 国精品**一区二区三区在线蜜桃| 久久男人av资源网站| 国产一区二区三区在线视频观看| julia中文字幕一区二区99在线| 一区二区三区国产豹纹内裤在线| 女女同性女同一区二区三区91| 中文字幕一区二区久久人妻| 久久久久久久欧美精品| 久久伊人91精品综合网站| 综合 欧美 亚洲日本| 动漫av一区| 欧美日韩在线不卡| 冲田杏梨av在线| 香蕉成人影院| 欧美日韩不卡在线| 成人性生交视频免费观看| 亚洲电影观看| 亚洲精品国产a久久久久久| 熟女视频一区二区三区| 毛片免费在线播放| 国产精品无遮挡| 一区二区冒白浆视频| 九七久久人人| 亚洲激情五月婷婷| 亚洲精品中字| 国产网站在线免费观看| 亚洲愉拍自拍另类高清精品| 2018日日夜夜| 成人看片在线观看| 欧美日韩高清在线| 自拍偷拍激情视频| 日韩深夜影院| 日韩在线免费高清视频| 久久久精品国产sm调教网站| aa亚洲婷婷| 国产成人自拍视频在线观看| 一炮成瘾1v1高h| 成人综合婷婷国产精品久久| 久久综合狠狠综合久久综青草| 欧美视频一二区| 国产成人一级电影| 成人综合国产精品| 熟妇高潮一区二区高潮| 成人av第一页| 日本午夜一区二区三区| 色综合久久影院| 国产精品传媒视频| 亚洲日本一区二区三区在线不卡| 九色视频网站在线观看| 久久众筹精品私拍模特| 色中文字幕在线观看| 69视频在线| 亚洲一区二区高清| 久久午夜夜伦鲁鲁一区二区| 亚洲精品黑牛一区二区三区| 精品久久久久一区二区国产| 亚洲欧洲久久久| 欧美日一区二区在线观看| 国产成人精品久久久| 高潮毛片又色又爽免费| 精品中文字幕一区二区| 麻豆精品视频| 欧美性video| 欧美午夜精品一区二区三区| 制服丝袜在线第一页| 日韩精品一区二区三区免费观看 | 鲁一鲁一鲁一鲁一澡| 久久www人成免费看片中文| 欧美综合亚洲图片综合区| 日本人视频jizz页码69| 麻豆精品av| 欧美日韩999| 亚洲无码久久久久| 国产成人午夜99999| 国产伦精品一区二区三毛| 五月婷婷六月色| 亚洲欧美日韩系列| 午夜免费高清视频| 蜜桃一区二区三区| 97国产在线视频| 亚洲AV无码精品国产| 国产精品福利电影一区二区三区四区| av动漫免费观看| 成人做爰免费视频免费看| 日韩电视剧免费观看网站| 国产成人精品无码免费看夜聊软件| 国产尤物久久久| 日韩视频一区在线| 最好看的日本字幕mv视频大全| 国产精一品亚洲二区在线视频| 国产精品二区三区四区| gogo在线观看| 欧美一区二区三区在线观看| 国产熟女高潮一区二区三区| 欧美国产先锋| 亚洲xxxx18| 黄色在线视频网站| 欧美男同性恋视频网站| 久久一级免费视频| 日韩视频在线一区二区三区| 成人激情av| 欧美v亚洲v| 欧美性猛片aaaaaaa做受| 成都免费高清电影| 久久夜色精品| 色999日韩自偷自拍美女| 日韩av超清在线观看| 色悠悠国产精品| 国产精品久久久久久久一区二区| 91女神在线视频| 在线观看视频黄色| 成人免费观看49www在线观看| 日韩精品中文字幕在线| 中文字幕在线观看成人| 日韩精品亚洲一区二区三区免费| 成人av电影免费| 91资源在线观看| 亚洲美女又黄又爽在线观看| 欧美精品一二三四区| 欧美国产精品中文字幕| 99精品在线免费视频| 欧美**字幕| 国产免费亚洲高清| 黑人玩欧美人三根一起进| 亚洲国产精品久久久久| 中文字幕第四页| 国产精品久久久久国产精品日日| 国产偷人视频免费| 欧美日韩在线播放视频| 91社区国产高清| heyzo高清中文字幕在线| 亚洲男人天堂古典| 可以免费在线观看的av| 国产日韩av一区二区| 中文字幕 日韩 欧美| 欧美激情四色| 欧美国产综合视频| 外国成人毛片| 97在线视频一区| av网站在线播放| 欧美xxxxxxxxx| 成人免费视频国产免费| 亚洲欧美日韩国产综合| 亚洲精品成人在线播放| 激情欧美国产欧美| 亚洲日本精品国产第一区| 国产精品极品国产中出| 国产精品久久久久aaaa九色| 国产日韩精品在线看| 日韩欧美国产三级| 亚洲s码欧洲m码国产av| 一区二区三区不卡在线观看| 佐佐木明希电影| 日韩国产欧美在线播放| 天堂8在线天堂资源bt| 精品久久久久中文字幕小说 | 国产亚洲精品女人久久久久久| 国产精品一区二区果冻传媒| 精品国产一区二区三区在线| 麻豆国产一区| 国产999精品| 青草在线视频| www国产精品视频| 日本在线视频1区| 在线免费亚洲电影| 国产aaaaaaaaa| 国产一区视频在线看| 成人小视频在线看| 伊人成人在线视频| 日本黄xxxxxxxxx100| 国产一区网站| 欧美亚洲精品日韩| 精品国产乱子伦一区二区| 秋霞av国产精品一区| 91在线高清| 日韩精品欧美激情| 手机av在线免费观看| 欧美一区二区三区在线视频| 亚洲一区在线观| 欧美丝袜自拍制服另类| 五月天激情四射| 婷婷亚洲久悠悠色悠在线播放| 国产精品免费无码| 激情文学综合丁香| 色悠悠久久综合网| 日韩影院免费视频| 日本黄网站免费| 亚洲欧美日韩国产一区| www.好吊操| 亚洲高清久久| 精品少妇在线视频| 成人av国产| 日韩av高清在线播放| 久久超碰99| 欧美一区二区在线| jazzjazz国产精品麻豆| 国产传媒一区二区三区| 日韩精品视频中文字幕| 91欧美激情另类亚洲| 精品国产亚洲日本| 国产精品2018| 成人免费毛片嘿嘿连载视频…| 欧美高清视频一区二区| 乱插在线www| 久久频这里精品99香蕉| 九九精品调教| 国产69精品99久久久久久宅男| 亚洲乱亚洲乱妇| 久久精品久久久久| 在线免费观看的av| 欧美激情xxxx| 欧美aa在线观看| 日本高清不卡在线| 日韩毛片在线| 91最新在线免费观看| 日韩在线短视频| 国产精品影院在线观看| 91精品一区| 国产精品久久视频| 成人污版视频| 国产精品自拍首页| 日韩成人视屏| 成人av在线网址| 136国产福利精品导航网址应用| 国产精品夜色7777狼人| 素人一区二区三区| 亚洲最大的网站| 日本成人a网站| 亚洲免费视频一区| 国产日产精品_国产精品毛片| 国内精品视频免费| 91久久偷偷做嫩草影院电| 久久99久久精品国产| 日韩国产欧美| 国产美女主播在线| 男人操女人的视频在线观看欧美| 怡红院av亚洲一区二区三区h| 国内激情久久| 青青青在线播放| 国产精品66部| 六月婷婷七月丁香| 亚洲乱码一区二区三区在线观看| 老熟妇高潮一区二区三区| 亚洲成国产人片在线观看| 日本视频免费观看| 日韩三级视频中文字幕| 你懂的在线看| 欧美福利小视频| 超碰这里只有精品| 精品国产一区二区三区日日嗨| 日韩黄色网络| 青少年xxxxx性开放hg| 噜噜噜在线观看免费视频日韩 | 日韩免费av一区二区三区| 你懂的一区二区三区| 蜜臀在线免费观看| 久热精品在线| 国产chinese中国hdxxxx| 国产精品久久午夜夜伦鲁鲁| 五月天综合激情| 欧美一级电影网站| 网友自拍视频在线| 日韩av观看网址| xxxxxhd亚洲人hd| 男女啪啪的视频| 日本成人在线一区| 美国黄色一级毛片| 一区二区三区欧美在线观看| 中文字幕乱码无码人妻系列蜜桃| 欧美日韩一区中文字幕| 中文字幕视频免费观看| 91精品国产麻豆国产自产在线| 亚洲av无码国产精品永久一区 | 日本免费观看网站| 99热这里都是精品| 欧美精品videos极品| 欧美高清激情brazzers| 蜜桃视频在线观看www| 久久色在线播放| 美女露胸视频在线观看| 2020国产精品久久精品不卡| 欧美电影免费| 亚洲黄色a v| 久久女同精品一区二区| 91精品少妇一区二区三区蜜桃臀| 亚洲一区二区在线免费观看视频 | 欧美激情免费| 国产精品 欧美在线| 91麻豆精品国产91久久久久推荐资源| 久久久久综合一区二区三区| 亚洲国产1区| 亚洲午夜久久久久久久久| 亚洲国产视频a| 成人免费公开视频| 中文字幕日韩在线观看| 国精一区二区三区| 国产精品9999久久久久仙踪林| 精品视频99| 另类小说第一页| 国产精品嫩草影院av蜜臀| 在线免费看毛片| 日韩中文字幕网站| 涩涩在线视频| 日韩av影视| 久久99精品久久久久久国产越南| 亚洲精品理论片| 欧美性猛交xxxx免费看| 黄色小视频在线免费观看| 国产成人精品视频在线| 国产精品chinese在线观看| 福利视频一区二区三区四区| 成人国产精品免费| 久久国产视频一区| 精品国产一二三| 大菠萝精品导航| 欧美日韩亚洲免费| 麻豆91精品91久久久的内涵| 国产精品丝袜一区二区| 精品嫩草影院久久| 中文字幕高清在线播放| 天天综合色天天综合色hd| 韩国一区二区在线观看| 国产大片免费看| 日韩www在线| 欧美国产日韩电影| 欧美交换配乱吟粗大25p| 99re热这里只有精品视频| 久久这里只有精品国产| 亚洲国产精品资源| yy6080久久伦理一区二区| 国产精品美女在线播放| av电影在线观看一区| 欧美一级做a爰片免费视频| 久久久91精品国产| 国产精品欧美一区二区三区不卡| 视频一区在线免费观看| 国产精品18久久久久久久网站| 日本视频在线免费| 精品蜜桃在线看| 欧美free嫩15| 青青青青在线视频| 国产免费成人在线视频| www.久久伊人| 国产精品aaaa| 国产精品久久| 娇妻被老王脔到高潮失禁视频| 色婷婷综合久久久久中文一区二区| 四虎影视2018在线播放alocalhost| 午夜欧美不卡精品aaaaa| 日本一本不卡| 亚洲男女在线观看|