電子產(chǎn)業(yè)一站式賦能平臺(tái)

PCB聯(lián)盟網(wǎng)

搜索
查看: 73|回復(fù): 0
收起左側(cè)

C++ 兩大派系之爭(zhēng)

[復(fù)制鏈接]

475

主題

475

帖子

4237

積分

四級(jí)會(huì)員

Rank: 4

積分
4237
跳轉(zhuǎn)到指定樓層
樓主
發(fā)表于 2024-12-4 09:01:00 | 只看該作者 |只看大圖 回帖獎(jiǎng)勵(lì) |倒序?yàn)g覽 |閱讀模式
點(diǎn)擊上方“C語(yǔ)言與CPP編程”,選擇“關(guān)注/置頂/星標(biāo)公眾號(hào)
干貨福利,第一時(shí)間送達(dá)!
最近有小伙伴說(shuō)沒(méi)有收到當(dāng)天的文章推送,這是因?yàn)槲⑿鸥牧送扑蜋C(jī)制,有一部分小伙伴刷不到當(dāng)天的文章,一些比較實(shí)用的知識(shí)和信息,錯(cuò)過(guò)了就是錯(cuò)過(guò)了,建議大家加個(gè)星標(biāo)??,就能第一時(shí)間收到推送。

關(guān)于 C++ 的未來(lái),近段時(shí)間似乎引發(fā)不少的爭(zhēng)論。無(wú)論是在 Reddit、HN 上,還是在 C++ 標(biāo)準(zhǔn)委員會(huì)的會(huì)議上,四處可見(jiàn)這些討論。

1、C++ 的現(xiàn)狀
當(dāng)前,我們所使用的 C++ 似乎正處于以下局面:
1. C++ 的演進(jìn)工作組(EWG)剛剛就采納 P3466 R0 達(dá)成共識(shí)——即,(重新)確認(rèn)未來(lái) C++ 演進(jìn)的設(shè)計(jì)原則:
  • 不允許 ABI(應(yīng)用二進(jìn)制接口)中斷,保持與 C 以及早期 C++ 版本的鏈接兼容性。
  • 不引入“病毒式注解”(例如,不支持生命周期注解)。
  • 堅(jiān)持一組互相矛盾的目標(biāo),例如同時(shí)要求不破壞 ABI 和零開(kāi)銷原則。
    這無(wú)論這是好是壞,都表明 C++ 的發(fā)展方向在進(jìn)一步鞏固當(dāng)前的軌跡。

    2. 與此同時(shí),一方面,美國(guó)政府希望人們停止使用 C++:
  • 美國(guó)網(wǎng)絡(luò)安全和基礎(chǔ)設(shè)施安全局(CISA)
  • 美國(guó)國(guó)家安全局(NSA)
  • 甚至白宮
    截至目前,美國(guó)政府的各個(gè)部門(mén)已經(jīng)發(fā)布了文件、報(bào)告和建議,警告行業(yè)不要使用內(nèi)存不安全的語(yǔ)言。



    3. 各種大型科技公司正在采用 Rust:
  • 微軟顯然正在用 Rust 重寫(xiě)核心庫(kù):去年 10 月,微軟在 GitHub 中發(fā)布了一系列開(kāi)發(fā)工具包,讓開(kāi)發(fā)者可以使用 Rust 語(yǔ)言來(lái)編寫(xiě) Windows 驅(qū)動(dòng)程序。
  • 谷歌似乎也致力于 Rust:其先是宣布支持使用 Rust 開(kāi)發(fā) Chromium,同時(shí)也開(kāi)發(fā)一個(gè)雙向 C++/Rust 互操作工具。
  • 2019 年,AWS 表示開(kāi)始在其基礎(chǔ)架構(gòu)中越來(lái)越多地使用 Rust 后,決定贊助 Rust,即 Rust 團(tuán)隊(duì)可以優(yōu)惠租用 AWS 基礎(chǔ)設(shè)施以進(jìn)行語(yǔ)言開(kāi)發(fā)。
  • ......
    說(shuō)到大型科技公司,近期還有幾件事值得注意:
  • 不久前,ISO C++ 委員會(huì)主席 Herb Sutter 在其個(gè)人博客宣布,他已經(jīng)離開(kāi)了工作 22 年的微軟,正式成為金融公司 Citadel Securities 的一名技術(shù)研究員。而 MSVC(Microsoft Visual C+)似乎在實(shí)現(xiàn) C++23 功能上進(jìn)展緩慢,還在向社區(qū)征求優(yōu)先級(jí)意見(jiàn)。


  • 臭名昭著的布拉格 ABI 投票事件發(fā)生了(簡(jiǎn)而言之:“C++ 23 不會(huì)破壞 ABI,將來(lái)是否會(huì)破壞也尚不明朗!保,據(jù)說(shuō) Google 大幅減少了參與 C 開(kāi)發(fā)過(guò)程的工作,轉(zhuǎn)而開(kāi)始開(kāi)發(fā)自己的 C++ 后續(xù)語(yǔ)言——Carbon。他們甚至寫(xiě)了一個(gè)文檔,總結(jié)他們?cè)趪L試改進(jìn) C++ 時(shí)遇到的種種困難(https://github.com/carbon-language/carbon-lang/blob/trunk/docs/project/difficulties_improving_cpp.md)。
    4. 社區(qū)中的問(wèn)題:
  • 之前有很多人分享過(guò)自己盡最大努力參與 C++ 標(biāo)準(zhǔn)委員會(huì)的過(guò)程,但最終卻被消耗殆盡。即使有些功能在 C 中實(shí)現(xiàn)了也沒(méi)有什么用。
  • 事到如今,模塊功能尚未實(shí)現(xiàn)。我們有模塊了嗎?答案是否定的。


  • 相信不少人還記得在 2023 年 CppCon 2023 的演講中,C++ 之父 Bjarne Stroustrup 首次提出了安全配置文件(Safety Profiles)的概念,目的是為 C++ 提供更強(qiáng)的類型和資源安全性,同時(shí)盡量避免破壞現(xiàn)有的兼容性。Safety Profiles 的核心是通過(guò)一組規(guī)則和工具引導(dǎo)開(kāi)發(fā)者編寫(xiě)更安全的代碼,同時(shí)允許不同的項(xiàng)目根據(jù)需求選擇適合的安全級(jí)別。然而,“安全配置文件”(Safety Profiles)仍處于一種奇怪的狀態(tài),沒(méi)有任何現(xiàn)有實(shí)現(xiàn),它試圖在盡量減少對(duì)現(xiàn)有代碼更改的情況下,為現(xiàn)有的 C++ 代碼增加某種程度的安全性。C++ 聯(lián)盟開(kāi)發(fā)人員 Sean Gaxter(Circle 編譯器的創(chuàng)造者)本人公開(kāi)反對(duì)配置文件,稱 C++ 為“定義不足”的語(yǔ)言。
    我不知道你怎么看,但如果我作為一個(gè)外行人來(lái)看待這一切,C++ 似乎基本上已經(jīng)分崩離析了,而且似乎很多人已經(jīng)對(duì) C++ 委員會(huì)能夠處理這些問(wèn)題的能力失去了信心。

    2、C++ 的兩大派系
    人們似乎正在尋找其他解決方案。
    比如說(shuō) Google。自從 ABI 投票以來(lái),Google 顯然對(duì)“這一標(biāo)準(zhǔn)化流程”失去了信心。這種失望并非針對(duì) C++ 語(yǔ)言本身——Google 自己擁有龐大的 C++ 代碼庫(kù),這門(mén)語(yǔ)言對(duì)他們來(lái)說(shuō)一直表現(xiàn)出色。然而,他們對(duì) C++ 在多方壓力(如潛在的政府監(jiān)管、其他語(yǔ)言的競(jìng)爭(zhēng)、大廠對(duì)更高性能和安全保障的需求等)下繼續(xù)演進(jìn)的能力失去了信心。
    那么問(wèn)題出現(xiàn)在哪里?為什么 C++ 不能做出改變呢?
    答案其實(shí)很簡(jiǎn)單。我們可以參考 ISO C++ 委員會(huì)主席 Herb Sutter 在其關(guān)于配置文件的論文中所說(shuō)的話:
    “我們必須盡量減少對(duì)現(xiàn)有代碼的修改需求。根據(jù)幾十年的經(jīng)驗(yàn),對(duì)于擁有大型代碼庫(kù)的大多數(shù)客戶來(lái)說(shuō),即便是為了安全原因,也不會(huì)因?yàn)閲?yán)格性規(guī)則而修改哪怕 1% 的代碼,除非有法規(guī)要求強(qiáng)制執(zhí)行。”
    ——Herb Sutter
    這很合理,不是嗎?沒(méi)人對(duì)此感到驚訝。
    現(xiàn)在,對(duì)比一下 Google 工程師 Chandler Carruth 在 WG21 成員頁(yè)面上的簡(jiǎn)介:
    “我主導(dǎo)了基于 Clang 的 C++ 工具和自動(dòng)化重構(gòu)系統(tǒng)的設(shè)計(jì),這些工具現(xiàn)在已成為 Clang 項(xiàng)目的一部分……
    在 Google 內(nèi)部,我?guī)ьI(lǐng)團(tuán)隊(duì)將這些基于 Clang 的自動(dòng)化重構(gòu)工具擴(kuò)展到整個(gè)代碼庫(kù),超過(guò) 1 億行 C++ 代碼。我們可以在 20 分鐘內(nèi)對(duì)整個(gè)代碼庫(kù)進(jìn)行分析并應(yīng)用重構(gòu)!

    看到了嗎?這里 Chandler Carruth 提到了一個(gè)關(guān)鍵詞是“自動(dòng)化工具”。但不只是自動(dòng)化遷移工具,這只是最顯眼的例子。
    兩種 C++ 用戶陣營(yíng)的對(duì)立
    實(shí)際上,我們看到的是兩種完全不同的 C++ 用戶陣營(yíng)之間的沖突:
  • 相對(duì)現(xiàn)代、有能力的技術(shù)公司,它們明白自己的代碼是一種資產(chǎn)。(這并不嚴(yán)格限于大科技公司。任何新興的 C++ 初創(chuàng)公司也屬于這一類。)
  • 其他所有人。那些仍在爭(zhēng)論如何縮進(jìn)代碼的老牌公司,以及年輕工程師試圖說(shuō)服管理層允許他設(shè)置代碼檢查工具的情況。
    這兩種用戶之間的關(guān)鍵區(qū)別在于:前者能夠相對(duì)順利地應(yīng)對(duì)遷移,因?yàn)樗麄兡軓陌姹净创a構(gòu)建整個(gè) C++ 棧,而后者則仍在使用 1998 年的老舊庫(kù)。
    這種能力——從版本化源碼構(gòu)建整個(gè)依賴棧(最好還帶有自動(dòng)化測(cè)試)——是兩大陣營(yíng)之間最重要的分水嶺。
    當(dāng)然,在實(shí)踐中,這是一個(gè)漸進(jìn)的過(guò)程。我可以想象,要把大公司的代碼庫(kù)從可怕的泥球變成半可管理、可構(gòu)建、經(jīng)過(guò)代碼檢查、適當(dāng)版本化、稍微不那么可怕的泥球,必須流下多少汗水、淚水、賬單和心血。
    事后看來(lái),很容易認(rèn)為這一切都是不可避免的:像 Google 這樣的公司(使用相對(duì)現(xiàn)代的 C++,擁有自動(dòng)化工具和測(cè)試,以及現(xiàn)代基礎(chǔ)設(shè)施)的需求與強(qiáng)烈向后兼容的愿望之間存在明顯的脫節(jié)。
    大膽地說(shuō),單一、無(wú)方言且統(tǒng)一的 C++ 的概念似乎已經(jīng)死多年了。至少,我們有兩種主流風(fēng)格的 C++:
  • 稍微現(xiàn)代化一點(diǎn)的 C++。一切都可以通過(guò)某種專用、干凈且統(tǒng)一的構(gòu)建流程從版本化的源碼構(gòu)建,至少比原始 CMake 稍微復(fù)雜一些,如果稍微瞇著眼睛看,它就能正常工作。包含一些靜態(tài)分析器、格式化程序、代碼檢查器。任何一種保持代碼庫(kù)清潔和現(xiàn)代化是有價(jià)值的共識(shí)?赡苤辽偈 C++17,帶有`unique_ptr`、`constexpr`、`optional`等特性,但這不是重點(diǎn)。重要的是工具。
  • 傳統(tǒng)的 C++。即任何不符合上述條件的 C++。比如那些存放在中型銀行古老服務(wù)器上的 C++。任何依賴于某個(gè)完全古老且已編譯代碼塊的 C++,其源碼已經(jīng)丟失,原作者也無(wú)法聯(lián)系。任何部署在寵物類型服務(wù)器上的 C++,以至于在其他地方啟動(dòng)它需要工程師花整整一個(gè)月的時(shí)間來(lái)弄清楚所有隱含的依賴項(xiàng)、配置和環(huán)境變量。這些主要被歸類為成本中心的代碼庫(kù)。任何從源碼構(gòu)建使用的二進(jìn)制文件都需要按下不止幾個(gè)按鈕,或者根本無(wú)法構(gòu)建的代碼。
    你會(huì)注意到,這兩種文化的分歧不在于 C++ 語(yǔ)言本身,而是工具和是否能從版本化源碼進(jìn)行干凈、有定義的構(gòu)建。理想情況下,甚至能夠在不需要記住以前開(kāi)發(fā)者通常設(shè)置的那個(gè)標(biāo)志或環(huán)境變量的情況下進(jìn)行部署。
    例如,Google 的代碼庫(kù)是否完全采用“現(xiàn)代” C++ 習(xí)慣用法并不是重點(diǎn)。關(guān)鍵是工具是否到位,以及是否能夠從源碼構(gòu)建。
    很多人會(huì)說(shuō)工具不是 C++ 標(biāo)準(zhǔn)委員會(huì)的責(zé)任,這觀點(diǎn)是對(duì)的。工具確實(shí)不是 C++ 標(biāo)準(zhǔn)委員會(huì)的責(zé)任,因?yàn)?C++ 標(biāo)準(zhǔn)委員會(huì)放棄了對(duì)它的責(zé)任(他們專注于語(yǔ)言規(guī)范,而非具體的實(shí)現(xiàn))。這是設(shè)計(jì)使然,考慮到遺留負(fù)擔(dān)很難去責(zé)怪他們。C++ 是一個(gè)統(tǒng)一不同實(shí)現(xiàn)的標(biāo)準(zhǔn)。
    話雖如此,如果說(shuō) Go 語(yǔ)言有一件事做對(duì)了,那就是他們把工具放得很重要。相比之下,C++ 出生于一個(gè)比 linter 更古老的時(shí)代。C++ 沒(méi)有統(tǒng)一的構(gòu)建系統(tǒng),也沒(méi)有接近統(tǒng)一的包管理系統(tǒng),語(yǔ)法復(fù)雜難以解析(這對(duì)工具來(lái)說(shuō)很糟糕),且每次改動(dòng)都在與 Hyrum 定律作斗爭(zhēng)。
    這兩個(gè)派系(良好的工具,可以毫不費(fèi)力地從源碼構(gòu)建 vs. 差勁的工具,無(wú)法從源碼構(gòu)建)之間存在著巨大的、不斷擴(kuò)大的裂痕,而且短期內(nèi)看不到彌合的可能性。
    C++ 委員會(huì)似乎堅(jiān)決維護(hù)向后兼容性,無(wú)論代價(jià)如何。
    順便說(shuō)一句,我并不一定反對(duì)這一點(diǎn)!向后兼容性對(duì)許多人來(lái)說(shuō)非常重要,理由充分。然而,對(duì)另一些人而言,這并不重要。這不是誰(shuí)“對(duì)”的問(wèn)題,而是兩種截然不同、無(wú)法調(diào)和的立場(chǎng)之間的沖突。
    3、造成的后果
    這就是為什么配置文件的設(shè)計(jì)是這樣的:安全配置文件的目的并不是為了解決現(xiàn)代、技術(shù)嫻熟的 C++ 公司的需求。它們是為了在不需要對(duì)舊代碼進(jìn)行任何更改的情況下帶來(lái)改進(jìn)。
    同樣地,對(duì)于模塊也是如此。設(shè)計(jì)初衷是讓你“只需”以模塊形式導(dǎo)入頭文件,而不會(huì)引發(fā)任何向后兼容性問(wèn)題。
    毫無(wú)疑問(wèn),大家都喜歡那些可以直接引入并在不改動(dòng)舊代碼的情況下帶來(lái)改進(jìn)的功能。但很明顯,這些功能的設(shè)計(jì)初衷是為了迎合“傳統(tǒng) C++”的需求。任何需要從傳統(tǒng) C++ 遷移的功能對(duì) C++ 標(biāo)準(zhǔn)委員會(huì)來(lái)說(shuō)都是不可行的,因?yàn)檎?Herb Sutter 所說(shuō),你基本上不能指望人們自己去遷移。
    (再次強(qiáng)調(diào),考慮傳統(tǒng) C++ 的需求并不是壞事。這完全是一個(gè)合理的決策。)
    這一點(diǎn)我始終牢記在心,每當(dāng)我閱讀 C++ 提案時(shí)都會(huì)注意:C++ 其實(shí)有兩個(gè)主要受眾群體。一是現(xiàn)代 C++ 用戶,另一個(gè)是傳統(tǒng) C++ 用戶。這兩個(gè)陣營(yíng)對(duì)許多問(wèn)題的看法大相徑庭,且許多提案都是針對(duì)其中一個(gè)特定群體的需求而撰寫(xiě)的。
    顯然,這導(dǎo)致了許多人無(wú)法互相理解,話說(shuō)不到一塊:盡管許多人以為安全配置文件和 safe C++ 是在解決同樣的問(wèn)題,實(shí)際上它們面向的是完全不同的受眾,解決的是完全不同的問(wèn)題。
    C++ 委員會(huì)正試圖阻止這種裂痕進(jìn)一步擴(kuò)大。這或許就是為什么 Sean Baxter 撰寫(xiě)的《 Safe C++》對(duì)他們來(lái)說(shuō)毫無(wú)意義的原因。這種提案是一種激進(jìn)且全面的變革,可能會(huì)開(kāi)創(chuàng)一種完全不同的 C++ 編程方式。
    當(dāng)然,也有人提出另一個(gè)問(wèn)題:是否某些 C++ 標(biāo)準(zhǔn)委員會(huì)成員只是過(guò)于固執(zhí),抓住各種理由來(lái)阻止他們個(gè)人在審美上不認(rèn)可的演進(jìn)。
    這是否屬實(shí),我不便評(píng)判,但關(guān)于 C++ 標(biāo)準(zhǔn)委員會(huì)應(yīng)用“雙重標(biāo)準(zhǔn)”的說(shuō)法并非首次聽(tīng)聞。比如“如果你想讓這個(gè)提案被通過(guò),我們要求你提供多個(gè)編譯器的完整、可用的實(shí)現(xiàn);但我們?nèi)匀辉敢庵С帜承┐箜?xiàng)目(例如模塊、配置文件),即便這些項(xiàng)目根本沒(méi)有任何可用的概念驗(yàn)證實(shí)現(xiàn)。”
    如果真是如此(我無(wú)法確證),我無(wú)法預(yù)測(cè) C++ 還能沿著這條道路走多久,除非最終發(fā)生更為劇烈的分裂。
    更不用提,打破 ABI 兼容性可能引發(fā)的巨大麻煩和一系列問(wèn)題,那簡(jiǎn)直就是個(gè)無(wú)底洞。
    4、C++ 未來(lái)將何去何從?
    面對(duì)現(xiàn)代企業(yè)和遺留系統(tǒng)給 C++ 社區(qū)內(nèi)部帶來(lái)兩極分化的趨勢(shì),不少網(wǎng)友看法不一。
    來(lái)自 Reddit 的用戶 ravixp 表示:
    這讓我感同身受,也許是因?yàn)槲以H眼看到一個(gè)非常大的 C++ 代碼庫(kù)在不同層面和不同規(guī)模上,從“遺留”C++逐步過(guò)渡到“現(xiàn)代”C++的過(guò)程。這種轉(zhuǎn)換涉及不同團(tuán)隊(duì)以各自的節(jié)奏和時(shí)間點(diǎn)推進(jìn),跨越了數(shù)十年的開(kāi)發(fā)周期,至今仍在進(jìn)行中。而任何新的代碼現(xiàn)代化計(jì)劃,都需要面對(duì)代碼庫(kù)中各部分的現(xiàn)代化水平不一致的問(wèn)題。
    (想象一下試圖對(duì)這樣的代碼添加靜態(tài)分析支持:它同時(shí)包含了 std::string、C 風(fēng)格字符串,以及 20 年前 STL 性能較差時(shí)團(tuán)隊(duì)自行創(chuàng)建的字符串類型的奇怪中間狀態(tài)!)
    關(guān)鍵在于,現(xiàn)代化的成本非常高昂。這里提到的“現(xiàn)代”C++不僅僅是用不同的方式編寫(xiě)代碼,它還包括一整套支持現(xiàn)代化標(biāo)準(zhǔn)的工具體系,這可能需要從零開(kāi)始構(gòu)建,還需要一個(gè)能夠跟上 C++ 演進(jìn)的工程團(tuán)隊(duì)。
    需要牢記的是,這里的沖突并不是“喜歡遺留 C++”的人與“喜歡現(xiàn)代 C++”的人之間的矛盾,而是“能負(fù)擔(dān)得起現(xiàn)代 C++”的人與“負(fù)擔(dān)不起”的人之間的矛盾。C++ 的確需要改變,但真正的問(wèn)題是:我們集體能夠承受多少變化的成本,以及如何從中獲得最大的價(jià)值。
    Kronikarz 評(píng)價(jià)道:
    從道德角度來(lái)看,我認(rèn)為這反映了一種分歧:一部分人對(duì) C++ 逐漸變成下一個(gè) COBOL 不以為意,另一部分人則對(duì)這一想法感到排斥。
    另一位網(wǎng)友 KittensInc 則認(rèn)為:
    遺留 C++ 正在迅速成為一種負(fù)擔(dān)。美國(guó)政府已經(jīng)意識(shí)到,通過(guò)做出不同的設(shè)計(jì)決策,可以完全避免某些類型的漏洞,并正在推動(dòng)人們減少這些錯(cuò)誤。我認(rèn)為,負(fù)責(zé)管理責(zé)任的機(jī)構(gòu)最終會(huì)加入這一趨勢(shì)只是時(shí)間問(wèn)題。
    如果像緩沖區(qū)溢出這樣的漏洞被認(rèn)為是完全可以預(yù)防的,那么從邏輯上講,如果某次黑客攻擊、勒索軟件事件或數(shù)據(jù)泄露的根本原因是緩沖區(qū)溢出,保險(xiǎn)公司可能會(huì)拒絕賠付。這樣一來(lái),公司可能會(huì)要求軟件供應(yīng)商對(duì)其代碼庫(kù)進(jìn)行第三方靜態(tài)分析審計(jì)。
    于是我們到達(dá)了這樣一個(gè)節(jié)點(diǎn):不進(jìn)行現(xiàn)代化改造的成本變得過(guò)高。你要么升級(jí)你的代碼庫(kù),要么你的公司走向滅亡。采用現(xiàn)代開(kāi)發(fā)實(shí)踐的企業(yè)只需運(yùn)行一些簡(jiǎn)單的分析工具并完成一些文書(shū)工作,而那些沒(méi)有任何像樣工具并且背負(fù)著數(shù)十年技術(shù)債務(wù)的公司將陷入嚴(yán)重困境。
    對(duì)此,你怎么看?
    作者 | Mond      翻譯 | 屠敏    出品 | CSDN(ID:CSDNnews)分享一個(gè)福利分享一個(gè)羊毛,最近極客時(shí)間出了一個(gè)《MySQL底層原理精講》的專欄,目前還在內(nèi)測(cè)階段,主要是看市場(chǎng)反饋來(lái)定價(jià),所以現(xiàn)在還是免費(fèi)階段,等上線了估計(jì)就可能收費(fèi)了
    除此外,附贈(zèng)前人的MySQL學(xué)習(xí)筆記,有意掃碼自取

    MySQL學(xué)習(xí)筆記

    一次吃透 MySQL 底層原理?? 架構(gòu)篇、事務(wù)篇、索引與鎖篇全覆蓋,掃描下方二維碼自取!



    我組建了一些社群一起交流,群里有大牛也有小白,如果你有意可以一起進(jìn)群交流。

    歡迎你添加我的微信,我拉你進(jìn)技術(shù)交流群。此外,我也會(huì)經(jīng)常在微信上分享一些計(jì)算機(jī)學(xué)習(xí)經(jīng)驗(yàn)以及工作體驗(yàn),還有一些內(nèi)推機(jī)會(huì)。

    加個(gè)微信,打開(kāi)另一扇窗
    感謝你的分享,點(diǎn)贊,在看三  

  • 發(fā)表回復(fù)

    本版積分規(guī)則


    聯(lián)系客服 關(guān)注微信 下載APP 返回頂部 返回列表