偷偷摘套内射激情视频,久久精品99国产国产精,中文字幕无线乱码人妻,中文在线中文a,性爽19p

Linux下C/C++項目的編譯和調試安裝(vscode)

系統(tǒng) Linux
在 C/C++ 語言服務器領域,除了 Clangd,還有 Ccls 等也頗受關注 。從性能角度來看,Clangd 在處理大型項目時表現(xiàn)出色。當面對一個包含大量源文件和復雜依賴關系的項目時,Ccls 在初始化和索引構建階段可能會消耗較多的內存和時間,導致編輯器響應速度變慢 。

在 Linux 系統(tǒng)下進行 C/C++ 項目開發(fā)時,高效的編譯與調試環(huán)境至關重要。VSCode 作為一款輕量且功能強大的代碼編輯器,配合 Linux 系統(tǒng)原生的工具鏈(如 GCC/G++ 編譯器、GDB 調試器以及 Make/CMake 構建工具),能夠為開發(fā)者打造出高度集成、便捷高效的開發(fā)環(huán)境。通過合理配置 VSCode 的 C/C++ 插件及調試組件,開發(fā)者可以實現(xiàn)智能代碼補全、語法高亮、實時錯誤檢查等編輯功能,同時結合 launch.json 和 tasks.json 配置文件,輕松實現(xiàn)一鍵編譯、自動化構建和斷點調試。此外,VSCode 對 Git 版本管理的原生支持及豐富的擴展生態(tài),進一步提升了代碼管理和項目協(xié)作的效率。

許多開發(fā)者在初次接觸 Linux 下 VSCode 的 C/C++ 開發(fā)環(huán)境配置時,可能會遇到一些困惑,比如如何正確安裝相關工具,怎樣配置編譯和調試參數等。接下來,本文將逐步引導你完成在 Linux 系統(tǒng)中,使用 VSCode 進行 C/C++ 項目編譯與調試環(huán)境的搭建,助你快速開啟高效的開發(fā)之旅。無論是新手開發(fā)者入門,還是有經驗的程序員優(yōu)化開發(fā)流程,都能從本文中獲取實用的方法和技巧。

一、前期準備

1.1VScode 下載與安裝

首先,我們需要下載并安裝 VScode。VScode 是一款輕量級且功能強大的代碼編輯器,支持多種編程語言,并且擁有豐富的插件生態(tài)系統(tǒng),非常適合用于 C/C++ 開發(fā)。你可以從 VScode 的官方網站(https://code.visualstudihttp://o.com/ )下載安裝包。

在下載時,要注意根據你的操作系統(tǒng)版本和硬件情況選擇合適的版本。比如,如果你使用的是 64 位的 Windows 系統(tǒng),就應該下載 64 位版本的 VScode。下載完成后,雙擊安裝包,按照安裝向導的提示進行傻瓜式安裝即可。在安裝過程中,建議選擇默認的安裝選項,不過安裝路徑最好使用英文路徑,以避免可能出現(xiàn)的兼容性問題。安裝完成后,打開 VScode,你會看到一個簡潔而美觀的界面,接下來就可以進行下一步的配置啦 。

1.2編譯器選擇與安裝(以 MinGW 為例)

在 Windows 系統(tǒng)上進行 C/C++ 開發(fā),我們需要安裝一個編譯器。這里我推薦使用 MinGW,它是 Minimalist GNU for Windows 的縮寫,是一個在 Windows 平臺上使用的 GNU 工具集,包含了 GCC 編譯器、GNU Binutils 和 GNU Make 等工具,能夠幫助我們在 Windows 系統(tǒng)上輕松編譯和運行 C/C++ 程序。

你可以從 MinGW 的官方網站(https://www.mingw-http://w64.org/downloads/ )下載安裝包。在下載頁面,你會看到不同版本的 MinGW 可供選擇。對于大多數用戶來說,選擇最新版本即可。下載完成后,解壓安裝包到你希望安裝的目錄,比如 “C:\MinGW”,注意解壓路徑中不要包含中文和空格,以免出現(xiàn)問題。

解壓完成后,還需要配置環(huán)境變量,這樣系統(tǒng)才能找到 MinGW 的可執(zhí)行文件。具體步驟如下:

  1. 右鍵點擊 “此電腦”,選擇 “屬性”。
  2. 在彈出的窗口中,點擊左側的 “高級系統(tǒng)設置”。
  3. 在 “系統(tǒng)屬性” 窗口中,點擊 “環(huán)境變量” 按鈕。
  4. 在 “系統(tǒng)變量” 中找到 “Path” 變量,點擊 “編輯”。
  5. 點擊 “新建”,將 MinGW 的 “bin” 目錄路徑添加進去,例如 “C:\MinGW\bin”。
  6. 依次點擊 “確定” 關閉所有窗口,完成環(huán)境變量的配置。

配置完成后,我們來驗證一下 MinGW 是否安裝成功。打開命令提示符(CMD),輸入 “gcc -v”,如果出現(xiàn) GCC 編譯器的版本信息,就說明 MinGW 已經安裝成功啦。

二、VScode 插件安裝

2.1C/C++ 插件

安裝完 VScode 和編譯器后,我們還需要安裝一些插件來增強 VScode 對 C/C++ 開發(fā)的支持。首先,最重要的就是 C/C++ 插件,它是 VScode 進行 C/C++ 開發(fā)必不可少的插件,就像是給 VScode 裝上了 “C/C++ 開發(fā)的翅膀”。

這個插件提供了一系列強大的功能,比如代碼智能補全,當你輸入代碼時,它會自動提示可能的代碼片段,大大提高了編碼效率,減少了因拼寫錯誤導致的問題;還有語法高亮功能,它會根據 C/C++ 的語法規(guī)則,用不同的顏色標記代碼中的關鍵字、變量、注釋等,讓你的代碼結構一目了然,閱讀和調試代碼都更加輕松。另外,它還支持代碼調試、代碼格式化等實用功能。

安裝 C/C++ 插件的步驟非常簡單:打開 VScode,點擊左側邊欄的擴展圖標(看起來像四個小方塊),在搜索框中輸入 “C/C++”,然后在搜索結果中找到 “C/C++” 插件,點擊 “安裝” 按鈕即可。安裝完成后,VScode 會自動加載插件,你就可以開始享受它帶來的便利啦。

2.2Chinese (Simplified) Language Pack for Visual Studio Code(中文漢化插件)

考慮到有些小伙伴可能不太習慣英文界面,VScode 貼心地提供了中文漢化插件 ——Chinese (Simplified) Language Pack for Visual Studio Code。安裝這個插件后,VScode 的界面就會變成中文,操作起來更加得心應手。

安裝方法和安裝 C/C++ 插件類似,在擴展商店中搜索 “Chinese (Simplified) Language Pack for Visual Studio Code”,找到后點擊 “安裝”。安裝完成后,需要重啟 VScode 才能使?jié)h化生效。重啟后,你會驚喜地發(fā)現(xiàn),VScode 的界面已經變成熟悉的中文啦,是不是感覺親切了許多。

2.3Clangd 擴展

打開 VS Code,按下快捷鍵 Ctrl+Shift+X(Windows/Linux)或 Command+Shift+X(Mac),調出擴展視圖。在搜索框中輸入 “clangd” ,你會看到 Clangd 插件出現(xiàn)在搜索結果中,點擊 “安裝” 按鈕,稍等片刻,插件便能安裝完成 。

不過,僅僅安裝插件還不夠,你還需要安裝包含 clangd 可執(zhí)行文件的 LLVM/Clang 工具鏈。在 Windows 系統(tǒng)下,你可以前往 LLVM 官方網站下載安裝包,或者借助包管理器 Chocolatey,在命令行中輸入 “choco install llvm” 進行安裝,安裝時記得將 LLVM 的 bin 目錄添加到系統(tǒng)的 PATH 環(huán)境變量中;如果你使用的是 macOS,若已安裝 Xcode 命令行工具,可能已經自帶了 Clang,當然也可以通過 Homebrew 安裝,執(zhí)行 “brew install llvm” ,安裝后按照提示將 LLVM 的 bin 目錄添加到 PATH;Linux 用戶則較為簡單,大多數發(fā)行版的包管理器中都有 LLVM/Clang,比如 Debian/Ubuntu 系統(tǒng),在終端輸入 “sudo apt-get install clangd” ,F(xiàn)edora 系統(tǒng)輸入 “sudo dnf install clangd” 即可完成安裝 。

安裝完成后,重啟 VS Code,打開一個 C 或 C++ 源文件(.c、.cpp、.h、.hpp 等),如果一切順利,你會在 VS Code 右下角的狀態(tài)欄看到 “clangd” 字樣,有時還能看到索引進度或狀態(tài)信息,此時嘗試輸入一些代碼,代碼補全、懸停提示等功能應該就能正常使用了 。

(1)配置要點

Clangd 要發(fā)揮出最佳效果,離不開一個關鍵文件 ——compile_commands.json,它包含了項目中每個源文件的詳細編譯命令,如使用的編譯器、包含路徑、宏定義、編譯旗標等 。Clangd 通過這個文件了解項目的編譯方式,從而進行精確的代碼分析。

對于使用 CMake 作為構建系統(tǒng)的項目,生成 compile_commands.json 文件很簡單。你只需在 CMakeLists.txt 文件中添加 “set (CMAKE_EXPORT_COMPILE_COMMANDS ON)” ,或者在執(zhí)行構建命令時帶上參數 “cmake -DCMAKE_EXPORT_COMPILE_COMMANDS=ON ..” ,重新執(zhí)行 cmake 命令后,在 build 目錄下就會生成 compile_commands.json 文件 。為了方便 Clangd 識別,你可以將這個文件軟鏈接或復制到項目根目錄 。

如果項目使用 Makefile 作為構建系統(tǒng),你可以借助 compiledb 工具來生成 compile_commands.json 文件。首先確保你已經安裝了 Python,然后在命令行中輸入 “pip install compiledb” 安裝 compiledb 工具 。生成編譯數據庫時,使用 “compiledb -n make” 命令僅生成 json 配置文件,不執(zhí)行編譯;若要執(zhí)行編譯并生成 json 配置文件,則使用 “compiledb make” 命令 。執(zhí)行完成后,就能在項目目錄中看到生成的 compile_commands.json 文件了 。

(2)功能亮點

它的強大之處在于,其基于真實的編譯過程來分析代碼。比如在一個大型 C++ 項目中,當你定義了一個復雜的模板類,Clangd 能夠準確理解模板的實例化過程、參數類型等,而不是像一些簡單的代碼分析工具,僅僅通過文本匹配來提供有限的功能。 它還能在你輸入代碼的同時,實時檢查語法錯誤、類型不匹配等問題,并給出詳細的診斷信息,就像是一個嚴格又耐心的老師,時刻幫你把關代碼質量。

①代碼補全,智能感知:在代碼編寫過程中,Clangd 的代碼補全功能宛如一位心有靈犀的助手,總能在你需要時及時送上精準建議 。它基于強大的上下文感知能力,深入理解代碼的語法結構、類型系統(tǒng)以及項目中的各種符號。比如,當你在一個復雜的 C++ 項目中輸入一個類名后再輸入點號,Clangd 能瞬間羅列出該類的所有成員函數和變量,即便是模板類也不在話下,它能準確識別模板參數,給出正確的補全內容。不僅如此,Clangd 還支持片段補全,為你節(jié)省大量的敲代碼時間。當你輸入 “for”,它會自動補全一個完整的 for 循環(huán)模板,包括初始化、條件判斷和自增部分,你只需根據實際需求修改關鍵部分即可。而且,它還會根據符號的使用頻率進行優(yōu)先級排序,高頻使用的符號會優(yōu)先顯示,讓你在眾多補全選項中能快速找到常用內容 。

②實時診斷,代碼 “體檢”:代碼中的錯誤就像隱藏在暗處的 “小怪獸”,總是讓人頭疼。不過,有了 Clangd,這些 “小怪獸” 便無處遁形 。它能在你輸入代碼的同時,實時進行錯誤檢查,無論是簡單的語法錯誤,如括號不匹配、分號遺漏,還是復雜的類型不匹配問題,它都能第一時間發(fā)現(xiàn),并在代碼下方用波浪線醒目地標記出來。當你將鼠標懸停在標記處,詳細的錯誤信息和建議便會彈出,引導你迅速定位和解決問題 。Clangd 還集成了 Clang-Tidy 工具,為代碼進行更全面的靜態(tài)代碼分析。它能檢查出潛在的內存泄漏風險、代碼風格是否符合規(guī)范等深層次問題,幫助你從源頭上提升代碼質量,寫出更健壯、更優(yōu)雅的代碼 。

③便捷導航,輕松跳轉:在大型項目中,代碼文件眾多,函數和變量的定義分散在各個角落,代碼導航成了一項挑戰(zhàn) 。Clangd 的跳轉定義功能就像是給代碼世界繪制了一張精準的地圖,讓你輕松穿梭其中。當你想查看某個變量或函數的定義時,只需將光標放在符號上,按下快捷鍵(如 F12),Clangd 便能瞬間帶你跳轉到其定義處,哪怕定義在不同的文件中,也能快速定位 。查找引用功能也同樣強大,它能列出代碼庫中所有使用該符號的位置,讓你清晰了解符號的調用關系,無論是追蹤代碼邏輯,還是進行代碼修改,都能做到心中有數 。此外,符號大綱功能還能展示整個文件的結構,類、函數、宏等一目了然,方便你快速把握文件的整體架構 。

④高效重構,代碼優(yōu)化:隨著項目的不斷迭代,代碼重構是常有的事 。Clangd 的重命名符號功能堪稱神器,當你需要修改一個變量名或函數名時,只需選中符號,按下重命名快捷鍵(如 F2),Clangd 會自動在整個項目中搜索并替換所有相關引用,跨文件的批量修改也能輕松完成,確保代碼的一致性,大大減少手動修改的工作量和出錯概率 。如果你發(fā)現(xiàn)一段代碼邏輯復雜,想將其提取為一個獨立的函數或變量,Clangd 也能助你一臂之力。它會根據代碼的語義和上下文,給出合理的提取建議,幫助你優(yōu)化代碼結構,提高代碼的可讀性和可維護性 。

⑤貼心提示,隨時答疑:在閱讀和編寫代碼時,對于一些復雜的符號,我們常常需要了解其詳細信息 。Clangd 的懸停提示功能就像一個貼心的小秘書,當你將鼠標懸停在變量、函數等符號上時,它會立即顯示出變量的類型、函數的簽名,以及可能存在的文檔注釋,讓你無需翻閱大量代碼就能快速理解符號的含義和用法 。對于宏定義,Clangd 更是提供了宏展開預覽功能。你可以直接查看宏定義展開后的代碼,直觀了解宏在代碼中的實際作用,避免因宏的復雜性而產生理解誤區(qū) 。

三、項目初始化與基礎配置

3.1創(chuàng)建項目文件夾

現(xiàn)在,我們已經完成了前期的準備工作,接下來就可以開始創(chuàng)建我們的 C/C++ 項目啦。首先,在你的電腦磁盤上選擇一個合適的位置創(chuàng)建項目文件夾,比如 “D:\cpp_project”。這里要注意,項目文件夾的路徑最好全部使用英文,避免在后續(xù)的編譯和調試過程中出現(xiàn)因中文路徑導致的亂碼或找不到文件等問題,就像我們之前安裝軟件時選擇英文路徑一樣重要哦。

創(chuàng)建好文件夾后,打開 VScode,點擊菜單欄中的 “文件”->“打開文件夾”,然后選擇剛才創(chuàng)建的項目文件夾,這樣 VScode 就會以這個文件夾為工作區(qū),對項目進行管理和操作啦。你會在 VScode 的資源管理器中看到這個項目文件夾,接下來就可以在里面添加各種文件和代碼啦。

3.2編寫簡單測試代碼

在項目文件夾中,我們新建一個 C++ 文件,用于編寫我們的測試代碼。右鍵點擊項目文件夾,選擇 “新建文件”,然后將文件命名為 “

maincpp”。這里文件的命名可以根據你的喜好和項目規(guī)范來,但是通常習慣將主程序文件命名為 “main.cpp”,這樣一目了然,方便管理和維護。

接下來,在 “main.cpp” 文件中輸入以下簡單的代碼:

#include <iostream>

int main() {
    std::cout << "Hello, World! This is my first C++ project in VScode." << std::endl;
    return 0;
}

這段代碼的功能非常簡單,就是在控制臺輸出一句話 “Hello, World! This is my first C++ project in VScode.”,然后程序正常結束返回 0。其中,#include <iostream>是引入輸入輸出流庫,這樣我們才能使用std::cout進行輸出操作;int main()是程序的入口函數,所有的 C++ 程序都從這里開始執(zhí)行;std::cout << "..." << std::endl;就是輸出語句,std::endl表示換行;return 0;表示程序正常結束,返回 0 給操作系統(tǒng),這是一種約定俗成的做法哦。

現(xiàn)在我們已經創(chuàng)建好了項目文件夾并編寫了簡單的測試代碼,接下來就要進行關鍵的編譯和調試配置啦,這可是讓我們的代碼能夠正確運行的重要步驟,千萬不要錯過哦 。

四、關鍵配置文件解析與設置

4.1 tasks.json(編譯配置)

在 VScode 中,tasks.json文件就像是一個 “編譯指揮官”,它的主要作用是定義各種編譯任務,比如如何調用編譯器將我們編寫的 C/C++ 代碼編譯成可執(zhí)行文件。通過配置這個文件,我們可以告訴 VScode 使用哪個編譯器、傳遞哪些編譯參數等重要信息,讓編譯過程更加自動化和高效,就像給電腦下達了一套清晰的指令,讓它按照我們的要求去完成編譯工作。

創(chuàng)建tasks.json文件有兩種常見的方法。一種是通過 VScode 的菜單操作自動生成:點擊菜單欄中的 “終端”->“配置任務”,此時會彈出一個任務模板選擇框,里面有各種不同類型項目的任務模板,比如 C/C++ 項目可以選擇 “C/C++: g++ 生成活動文件”(這里假設使用的是 g++ 編譯器,如果你使用的是其他編譯器,選擇對應的選項即可)。選擇合適的模板后,VScode 會根據模板自動生成一個基本的tasks.json文件,并將其保存在項目文件夾下的.vscode文件夾中(如果.vscode文件夾不存在,VScode 會自動創(chuàng)建)。

另一種方法是手動新建并復制代碼。在項目文件夾下的.vscode文件夾中,右鍵點擊空白處,選擇 “新建文件”,然后將文件命名為 “tasks.json”。接著,從網上搜索適合你項目的tasks.json代碼模板,或者參考其他類似項目的配置,將代碼復制到新建的文件中。比如下面是一個簡單的tasks.json示例,用于使用 g++ 編譯器編譯當前打開的 C++ 文件:

{
    "version": "2.0.0",
    "tasks": [
        {
            "label": "build",
            "type": "shell",
            "command": "g++",
            "args": [
                "-g",
                "${file}",
                "-o",
                "${fileDirname}/${fileBasenameNoExtension}"
            ],
            "group": {
                "kind": "build",
                "isDefault": true
            }
        }
    ]
}

下面我們來詳細解讀一下這個文件中各關鍵字的含義:

  • version:表示tasks.json文件的版本號,目前常見的是 “2.0.0”,它就像是文件的一個標識,告訴 VScode 這個文件遵循的規(guī)范版本,確保 VScode 能夠正確理解和解析文件中的內容。
  • tasks:這是一個數組,里面可以包含多個任務配置。每個任務配置都是一個獨立的 JSON 對象,代表一個具體的任務,比如編譯任務、測試任務等,就像一個任務清單,把各種需要執(zhí)行的任務都羅列在里面。
  • label:給任務起一個名字,這個名字可以隨意取,但要能夠清晰地描述任務的功能,比如 “build” 表示這是一個編譯構建任務。在執(zhí)行任務時,我們可以通過這個名字來選擇要執(zhí)行的任務,就像給每個任務貼上了一個獨特的標簽,方便我們識別和調用。
  • type:指定任務的類型,“shell” 表示這個任務是通過在終端中執(zhí)行命令來完成的,就像是在命令行中輸入指令讓系統(tǒng)執(zhí)行;“process” 表示任務將作為獨立的進程運行,這兩種類型在不同的場景下各有優(yōu)勢,我們可以根據實際需求選擇。
  • command:要執(zhí)行的命令,這里是 “g++”,表示使用 g++ 編譯器進行編譯。如果你的系統(tǒng)中安裝了其他編譯器,比如 clang++,就可以把這里改為 “clang++”,它就像是告訴電腦要使用哪個工具來完成任務。
  • args:傳遞給命令的參數,是一個數組。在這個例子中,“-g” 表示生成調試信息,這樣我們在調試程序時就能更方便地查看變量的值和程序的執(zhí)行流程;“\({file}”是一個VScode的變量,表示當前打開的文件;“-o”表示指定輸出文件;“\){fileDirname}/\({fileBasenameNoExtension}”表示輸出文件的路徑和文件名,其中“\){fileDirname}” 表示當前文件所在的目錄,“${fileBasenameNoExtension}” 表示當前文件的文件名(不包含擴展名),通過這些變量和參數,我們可以靈活地控制編譯過程和輸出結果。.group:用于對任務進行分組,可以設置為 “build”(構建任務)或 “test”(測試任務)等?!発ind” 指定任務組的類型,“isDefault” 設置為 “true” 表示這個任務是默認的構建任務,當我們在 VScode 中按下快捷鍵(如 Ctrl+Shift+B)時,就會執(zhí)行這個默認任務,非常方便快捷。

在實際項目中,我們可能需要根據項目的具體需求修改這些配置。比如,如果項目中有多個源文件,我們可以將args中的 “${file}” 改為所有源文件的文件名,或者使用通配符來匹配所有源文件,這樣就能一次性編譯整個項目。再比如,如果我們需要指定額外的編譯選項,如優(yōu)化級別、鏈接庫路徑等,也可以在args數組中添加相應的參數。例如,要將優(yōu)化級別設置為最高(-O3),并鏈接一個名為 “mylib” 的庫,可以這樣修改args:

"args": [
    "-g",
    "-O3",
    "${file}",
    "-o",
    "${fileDirname}/${fileBasenameNoExtension}",
    "-L/path/to/mylib",
    "-lmylib"
]

其中,“-L/path/to/mylib” 指定了庫文件所在的路徑,“-lmylib” 表示鏈接名為 “mylib” 的庫,通過這樣的配置,我們就能滿足項目中各種復雜的編譯需求啦。

4.2 launch.json(調試配置)

launch.json文件在 VScode 中扮演著 “調試指揮官” 的角色,它主要負責調試相關的設置,就像是給調試過程制定了一套詳細的規(guī)則和計劃。通過這個文件,我們可以告訴 VScode 使用哪種調試器、要調試的程序路徑在哪里、是否在程序入口處暫停、如何傳遞參數給程序等重要信息,讓我們能夠在開發(fā)過程中方便地進行斷點調試、監(jiān)視變量等操作,快速定位和解決代碼中的問題,就像給我們提供了一把打開代碼問題大門的鑰匙 。

創(chuàng)建和配置launch.json文件的步驟如下:首先,點擊 VScode 左側邊欄的調試圖標(看起來像一個蟲子),或者從菜單欄選擇 “運行”->“啟動調試”。如果這是你第一次在該項目中進行調試,VScode 會提示你是否需要創(chuàng)建一個新的調試配置,點擊 “創(chuàng)建配置”,此時會彈出一個調試器類型選擇框。對于 C/C++ 項目,我們通常選擇 “(gdb) 啟動”,這里的 gdb 是 GNU 調試器,是一種常用的調試工具,它能夠幫助我們深入了解程序的運行狀態(tài),找出隱藏在代碼中的問題。

選擇調試器類型后,VScode 會自動生成一個launch.json文件模板,并將其保存在項目文件夾下的.vscode文件夾中。以下是一個基本的launch.json配置示例:

{
    "version": "0.2.0",
    "configurations": [
        {
            "name": "(gdb) 啟動",
            "type": "cppdbg",
            "request": "launch",
            "program": "${workspaceFolder}/a.out",
            "args": [],
            "stopAtEntry": false,
            "cwd": "${workspaceFolder}",
            "environment": [],
            "externalConsole": false,
            "MIMode": "gdb",
            "setupCommands": [
                {
                    "description": "為 gdb 啟用整齊打印",
                    "text": "-enable-pretty-printing",
                    "ignoreFailures": true
                }
            ]
        }
    ]
}

下面來詳細解釋一下各個配置項的含義:

  • version:同樣表示launch.json文件的版本號,目前常見的是 “0.2.0”,它確保了 VScode 能夠正確解析文件中的配置信息,就像一個版本標識,讓 VScode 知道該按照什么規(guī)則來讀取和應用這些配置。
  • configurations:這是一個數組,里面可以包含多個調試配置。每個調試配置都是一個獨立的 JSON 對象,代表一種不同的調試方式或場景,比如可以針對不同的運行環(huán)境、不同的程序入口等設置不同的調試配置,就像一個調試方案的集合,我們可以根據實際情況選擇合適的方案進行調試。
  • name:給調試配置取一個名字,方便在調試配置列表中識別和選擇,比如 “(gdb) 啟動”,這個名字可以根據你的喜好和實際用途來取,但要盡量清晰明了,讓人一眼就能知道這個配置的作用。
  • type:指定調試器的類型,“cppdbg” 表示使用 C++ 調試器,這是專門為 C/C++ 語言開發(fā)的調試器,能夠很好地支持 C/C++ 代碼的調試工作,就像是一個專門為 C/C++ 程序量身定制的調試工具。
  • request:調試請求類型,“l(fā)aunch” 表示啟動一個新的調試會話,也就是直接啟動要調試的程序;“attach” 表示附加到一個已經運行的進程上進行調試,在一些特殊情況下,比如調試一個已經在后臺運行的服務程序時,就可以使用 “attach” 方式,根據不同的調試需求,我們可以靈活選擇這兩種請求類型。
  • program:指定要調試的程序路徑。這里使用了 “\({workspaceFolder}/a.out”,“\){workspaceFolder}” 是 VScode 的變量,表示當前項目文件夾,“a.out” 是編譯后的可執(zhí)行文件的文件名(在 Linux 和 Mac 系統(tǒng)下默認的可執(zhí)行文件名是 “a.out”,在 Windows 系統(tǒng)下可能是 “a.exe”,具體根據你的編譯設置和操作系統(tǒng)來確定),通過這個配置,VScode 就知道要調試哪個程序了。
  • args:傳遞給要調試程序的命令行參數,是一個數組。如果你的程序需要接收命令行參數才能正常運行,比如處理一些輸入文件、設置運行參數等,就可以在這里添加相應的參數。例如,如果你的程序需要接收一個輸入文件的路徑作為參數,可以這樣設置:"args": ["input.txt"],這樣在調試時,程序就會接收到 “input.txt” 這個參數,并按照你的代碼邏輯進行處理。
  • stopAtEntry:設置是否在程序入口處暫停。如果設置為 “true”,程序啟動后會立即暫停在main函數的第一行代碼處,方便我們從程序的起始位置開始調試,逐行檢查代碼的執(zhí)行情況;如果設置為 “false”,程序會直接開始運行,直到遇到斷點才會暫停,根據調試的需求,我們可以靈活調整這個設置。
  • cwd:指定調試時的當前工作目錄?!?{workspaceFolder}” 表示當前項目文件夾,這意味著在調試過程中,程序會將當前項目文件夾作為工作目錄,查找相關的文件和資源。如果你的程序需要讀取項目文件夾中的配置文件、數據文件等,這個設置就非常重要,確保程序能夠正確找到所需的文件路徑。
  • environment:設置調試時的環(huán)境變量,是一個數組。有些程序可能依賴于特定的環(huán)境變量才能正常運行,比如設置一些庫的路徑、配置參數等,我們可以在這里添加相應的環(huán)境變量。例如,如果你的程序需要使用一個特定的庫,而這個庫的路徑沒有包含在系統(tǒng)默認的搜索路徑中,就可以通過設置環(huán)境變量來指定庫的路徑:"environment": [{"name": "LD_LIBRARY_PATH", "value": "/path/to/your/library"}],這樣在調試時,程序就能找到所需的庫文件了。
  • externalConsole:設置是否使用外部控制臺。如果設置為 “true”,調試時會彈出一個外部的控制臺窗口來顯示程序的輸出信息;如果設置為 “false”,程序的輸出信息會顯示在 VScode 的集成終端中,根據個人的使用習慣和項目需求,我們可以選擇合適的方式來查看程序的輸出。
  • MIMode:指定調試器的模式,“gdb” 表示使用 GDB 調試器模式,這是一種非常強大且常用的調試模式,能夠提供豐富的調試功能,滿足我們在調試 C/C++ 程序時的各種需求。
  • setupCommands:這是一個數組,里面可以包含多個調試器啟動前要執(zhí)行的命令。在這個例子中,設置了一個命令 “-enable-pretty-printing”,用于為 gdb 啟用整齊打印功能,這樣在調試時查看變量的值會更加清晰易讀,提高調試效率,通過這個配置,我們可以在調試前對調試器進行一些個性化的設置,讓調試過程更加順暢。

配置好launch.json文件后,我們就可以利用它實現(xiàn)斷點調試、監(jiān)視變量等強大的調試功能啦。斷點調試是一種非常有效的調試方法,我們可以在代碼中設置斷點,當程序執(zhí)行到斷點處時,會自動暫停運行,此時我們可以查看當前變量的值、調用棧信息、程序的執(zhí)行流程等,就像給程序的運行按下了 “暫停鍵”,讓我們有機會仔細檢查代碼的執(zhí)行情況,找出潛在的問題。在 VScode 中設置斷點非常簡單,只需要在代碼編輯器中點擊要設置斷點的行號旁邊的空白處,就會出現(xiàn)一個紅色的斷點標記。

監(jiān)視變量也是調試過程中常用的功能,我們可以在調試時關注某些變量的值的變化情況,以便更好地理解程序的運行邏輯。在 VScode 的調試界面中,有一個 “監(jiān)視” 面板,我們可以將需要監(jiān)視的變量添加到這個面板中,這樣在程序運行過程中,當執(zhí)行到斷點處暫停時,就能實時看到這些變量的值的變化,幫助我們快速定位問題,就像給程序中的變量安裝了一個 “監(jiān)視器”,時刻關注它們的動態(tài),確保程序的正確性。

4.3 c_cpp_properties.json(編譯器路徑和智能感知配置)

c_cpp_properties.json文件主要用于配置編譯器路徑和智能感知相關的設置,它就像是一個 “智能管家”,為我們的 C/C++ 開發(fā)提供了很多便利。通過這個文件,我們可以告訴 VScode 編譯器安裝在哪里,這樣 VScode 就能正確地調用編譯器進行編譯工作;同時,還可以設置智能感知的相關參數,比如選擇 IntelliSense 模式、指定語言標準等,讓 VScode 能夠更好地理解我們的代碼,提供更準確的代碼提示和補全功能,大大提高我們的編碼效率,就像有一個智能助手在旁邊,隨時為我們提供幫助和建議。

打開和修改c_cpp_properties.json文件的方法有多種。一種常見的方法是通過 VScode 的命令面板:按下快捷鍵 Ctrl+Shift+P(在 Mac 系統(tǒng)上是 Cmd+Shift+P),打開命令面板,然后輸入 “C/C++: Edit Configurations (JSON)”,選擇這個選項后,VScode 會自動打開項目文件夾下的.vscode文件夾中的c_cpp_properties.json文件(如果文件不存在,VScode 會自動生成一個默認的模板)。

以下是一個c_cpp_properties.json文件的示例:

{
    "configurations": [
        {
            "name": "Win32",
            "includePath": [
                "${workspaceFolder}/**"
            ],
            "defines": [],
            "compilerPath": "C:/MinGW/bin/gcc.exe",
            "cStandard": "c11",
            "cppStandard": "c++17",
            "intelliSenseMode": "msvc-x64"
        }
    ],
    "version": 4
}

接下來詳細解釋一下各個配置項的含義:

  • configurations:這是一個數組,里面可以包含多個配置項,每個配置項對應一種不同的編譯環(huán)境或設置。例如,如果你可能在不同的平臺上開發(fā),或者需要針對不同的項目需求使用不同的編譯器設置,就可以在這里添加多個配置項,方便切換和管理不同的開發(fā)環(huán)境,就像一個環(huán)境配置的集合,滿足我們多樣化的開發(fā)需求。
  • name:給每個配置項取一個名字,用于標識不同的配置,比如 “Win32” 表示這是針對 Windows 32 位系統(tǒng)的配置,這個名字可以根據你的實際情況來取,只要能夠清晰地區(qū)分不同的配置即可。
  • includePath:指定包含文件的搜索路徑,是一個數組。在 C/C++ 開發(fā)中,我們經常需要包含一些頭文件,這些頭文件可能位于項目文件夾的不同位置,或者是系統(tǒng)自帶的頭文件。通過設置includePath,我們可以告訴 VScode 在哪里查找這些頭文件?!?{workspaceFolder}/**” 表示在當前項目文件夾及其所有子文件夾中搜索頭文件,這樣 VScode 就能找到我們項目中自定義的頭文件了。如果你的項目還依賴于一些外部庫的頭文件,也可以在這里添加這些庫的頭文件路徑,確保 VScode 能夠正確識別和解析代碼中的頭文件引用。
  • defines:用于定義預處理宏,是一個數組。在 C/C++ 代碼中,我們可以使用預處理宏來控制代碼的編譯和行為,比如通過定義宏來開啟或關閉某些功能模塊、設置不同的編譯選項等。在這里添加的宏定義會在編譯時生效,例如,如果我們定義一個宏DEBUG,并將其值設置為 1,就可以在代碼中通過#ifdef DEBUG來判斷是否處于調試模式,從而執(zhí)行不同的代碼邏輯。在defines數組中可以這樣設置:"defines": ["DEBUG=1"],這樣在編譯時,編譯器就會識別這個宏定義,并按照我們的代碼邏輯進行處理。
  • compilerPath:指定編譯器的路徑。在這個例子中,“C:/MinGW/bin/gcc.exe” 表示使用 MinGW 安裝目錄下的 gcc 編譯器。如果你的編譯器安裝在其他位置,或者你使用的是不同的編譯器,比如 clang 編譯器,就需要將這里的路徑修改為

五、大型項目編譯調試要點

5.1多文件項目結構管理

在實際的大型 C/C++ 項目中,合理的文件和文件夾組織結構至關重要,它就像一個精心規(guī)劃的圖書館布局,能讓我們快速找到所需的代碼文件,提高開發(fā)和維護的效率。以一個簡單的游戲開發(fā)項目為例,我們可以采用如下的組織結構:

game_project/
│
├── include/
│   ├── game.h
│   ├── character.h
│   ├── map.h
│   └── utils.h
│
├── src/
│   ├── game.cpp
│   ├── character.cpp
│   ├── map.cpp
│   └── utils.cpp
│
├── resources/
│   ├── images/
│   │   ├── background.png
│   │   ├── character_sprite.png
│   │   └── ...
│   ├── sounds/
│   │   ├── background_music.mp3
│   │   ├── character_movement.wav
│   │   └── ...
│   └── levels/
│       ├── level1.txt
│       ├── level2.txt
│       └── ...
│
├── .vscode/
│   ├── tasks.json
│   ├── launch.json
│   └── c_cpp_properties.json
│
├── main.cpp
└── README.md

在這個結構中:

  • include文件夾用于存放所有的頭文件,這些頭文件定義了項目中各種類、函數和常量的聲明,就像一個 “說明書” 集合,讓其他文件知道如何使用這些功能。
  • src文件夾包含了實現(xiàn)這些功能的源文件,與include文件夾中的頭文件一一對應,實現(xiàn)了代碼的分離和模塊化,便于管理和維護。
  • resources文件夾用于存放項目所需的各種資源文件,如圖像、音頻和關卡數據等,將資源文件集中管理,方便項目的部署和更新。
  • .vscode文件夾存放了 VScode 的配置文件,如tasks.json用于編譯配置,launch.json用于調試配置,c_cpp_properties.json用于設置編譯器路徑和智能感知等,這些配置文件就像是項目在 VScode 中的 “個性化設置”,讓 VScode 能夠按照我們的需求對項目進行編譯和調試。
  • main.cpp是項目的入口文件,程序從這里開始執(zhí)行,它就像是項目的 “大門”,引導程序進入整個項目的功能世界。
  • README.md文件用于記錄項目的基本信息、使用方法和注意事項等,方便其他開發(fā)者了解和使用這個項目,就像一個項目的 “使用手冊”。

在 VScode 中管理和引用不同文件時,我們可以利用 VScode 強大的資源管理器功能。通過資源管理器,我們可以清晰地看到項目的文件夾結構,方便地打開、編輯和管理各個文件。比如,當我們需要添加一個新的功能模塊時,可以在include文件夾中新建一個頭文件,在src文件夾中新建一個對應的源文件,然后在其他需要使用這個功能的文件中,通過#include "新頭文件.h"來引用這個頭文件,就像在圖書館中找到對應的書籍并借閱使用一樣。同時,在編寫代碼時,VScode 的智能感知功能會根據我們設置的includePath自動識別和提示項目中的頭文件,大大提高了開發(fā)效率。

5.2編譯選項優(yōu)化

針對大型項目,優(yōu)化編譯選項可以顯著提高編譯速度和程序性能。在tasks.json文件中,我們可以添加各種編譯標志來實現(xiàn)優(yōu)化。例如,添加-O3編譯標志可以將優(yōu)化級別設置為最高,編譯器會對代碼進行大量的優(yōu)化,如循環(huán)展開、函數內聯(lián)、公共子表達式消除等,這些優(yōu)化措施可以大大提高程序的執(zhí)行效率,使程序運行得更快,但同時也會增加編譯時間,就像是讓工廠在生產產品時進行更精細的加工,雖然生產時間變長了,但產品的質量和性能更好了。

除了優(yōu)化級別設置,我們還可以根據項目的具體需求添加其他編譯標志。比如,如果項目中使用了多線程,我們可以添加-pthread標志,確保編譯器正確鏈接線程庫,使多線程功能能夠正常運行;如果項目中使用了一些特定的庫,我們可以通過-L標志指定庫文件所在的路徑,通過-l標志指定要鏈接的庫名,確保程序能夠正確鏈接這些庫,順利運行。例如:

"args": [
    "-g",
    "-O3",
    "-pthread",
    "-L/path/to/your/library",
    "-lyour_library",
    "${file}",
    "-o",
    "${fileDirname}/${fileBasenameNoExtension}"
]

這些優(yōu)化對編譯速度和程序性能有著明顯的影響。較高的優(yōu)化級別雖然會增加編譯時間,但可以使生成的可執(zhí)行文件在運行時更加高效,減少 CPU 占用和內存使用,提高程序的響應速度;而合理的庫路徑和庫名設置則可以確保程序能夠正確鏈接所需的庫,避免因庫鏈接問題導致的運行錯誤,保證程序的穩(wěn)定性和正確性。在實際項目中,我們需要根據項目的特點和需求,權衡編譯時間和程序性能之間的關系,選擇最合適的編譯選項,就像在不同的生產場景中,根據產品的需求和成本,選擇最合適的生產工藝一樣。

5.3調試技巧與常見問題解決

在大型項目調試過程中,一些實用技巧可以幫助我們更高效地定位和解決問題。條件斷點是一個非常強大的調試工具,它允許我們在滿足特定條件時才暫停程序執(zhí)行。比如,在一個游戲項目中,如果我們想調試某個角色在特定生命值下的行為,就可以設置一個條件斷點,當角色的生命值等于我們設定的值時,程序會自動暫停,這樣我們就可以仔細檢查此時程序的運行狀態(tài),查看變量的值和函數的調用情況,就像在游戲中設置了一個 “特殊關卡”,當滿足特定條件時,游戲會暫停,讓我們有機會研究游戲內部的運行機制。

內存調試也是大型項目調試中不可或缺的一部分。在 C/C++ 中,內存管理不當很容易導致內存泄漏、野指針等問題,這些問題往往很難調試。我們可以使用一些內存調試工具,如 Valgrind(在 Linux 系統(tǒng)上)或 Visual Leak Detector(在 Windows 系統(tǒng)上)來幫助我們檢測內存問題。這些工具可以在程序運行時監(jiān)測內存的分配和釋放情況,當發(fā)現(xiàn)內存泄漏或非法內存訪問時,會給出詳細的報告,指出問題發(fā)生的位置和原因,就像給程序的內存使用情況安裝了一個 “監(jiān)視器”,隨時發(fā)現(xiàn)并報告內存問題。

在調試過程中,我們也會遇到各種各樣的常見問題。比如編譯錯誤,這可能是由于語法錯誤、頭文件引用錯誤、庫鏈接錯誤等原因導致的。當遇到編譯錯誤時,我們首先要仔細查看錯誤信息,錯誤信息通常會指出錯誤發(fā)生的文件和行號,以及錯誤的類型和原因,就像醫(yī)生的診斷報告一樣,我們要根據這些信息來分析問題。如果是語法錯誤,我們需要檢查代碼的語法是否正確,是否遺漏了分號、括號等;如果是頭文件引用錯誤,我們要檢查頭文件的路徑是否正確,是否存在頭文件重復包含的問題;如果是庫鏈接錯誤,我們要檢查庫路徑和庫名的設置是否正確,是否缺少必要的庫文件。

另一個常見問題是調試器無法啟動。這可能是由于調試配置錯誤、調試器未正確安裝或系統(tǒng)環(huán)境問題等原因導致的。如果是調試配置錯誤,我們要檢查launch.json文件中的配置是否正確,比如program路徑是否指向了正確的可執(zhí)行文件,request類型是否正確,MIMode是否設置為正確的調試器模式等;如果是調試器未正確安裝,我們要重新安裝調試器,并確保調試器的路徑已經正確添加到系統(tǒng)環(huán)境變量中;如果是系統(tǒng)環(huán)境問題,我們要檢查系統(tǒng)是否缺少必要的依賴庫或組件,是否存在其他程序占用了調試器所需的端口等。通過對這些常見問題的分析和解決,我們可以逐步掌握調試大型項目的技巧,提高調試效率,確保項目的順利開發(fā)。

六、實戰(zhàn)體驗:用 Clangd 開發(fā)項目

6.1新建項目

現(xiàn)在,讓我們開啟一場使用 Clangd 開發(fā) C++ 項目的奇妙之旅。假設我們要創(chuàng)建一個簡單的數學運算庫項目,項目結構如下:

math_lib/
├── CMakeLists.txt
├── include/
│   └── math_operations.h
├── src/
│   ├── math_operations.cpp
│   └── main.cpp
└── build/

在include/math_operations.h文件中,我們定義了一些基本的數學運算函數:

#ifndef MATH_OPERATIONS_H
#define MATH_OPERATIONS_H

// 加法
int add(int a, int b);
// 減法
int subtract(int a, int b);
// 乘法
int multiply(int a, int b);
// 除法
int divide(int a, int b);

#endif

src/math_operations.cpp文件則是這些函數的具體實現(xiàn):

#include "../include/math_operations.h"

int add(int a, int b) {
    return a + b;
}

int subtract(int a, int b) {
    return a - b;
}

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

int divide(int a, int b) {
    if (b != 0) {
        return a / b;
    }
    // 簡單起見,這里直接返回0,實際應用中可以拋出異常等
    return 0;
}

src/main.cpp是項目的入口,用于測試這些數學運算函數:

#include "../include/math_operations.h"
#include <iostream>

int main() {
    int num1 = 10;
    int num2 = 5;

    std::cout << "加法結果: " << add(num1, num2) << std::endl;
    std::cout << "減法結果: " << subtract(num1, num2) << std::endl;
    std::cout << "乘法結果: " << multiply(num1, num2) << std::endl;
    std::cout << "除法結果: " << divide(num1, num2) << std::endl;

    return 0;
}

項目的 CMakeLists.txt 文件內容如下,用于構建項目:

cmake_minimum_required(VERSION 3.10)
project(math_lib)

set(CMAKE_CXX_STANDARD 17)
# 添加編譯命令導出選項
set(CMAKE_EXPORT_COMPILE_COMMANDS ON)

# 設置頭文件路徑
include_directories(include)

# 查找源文件
aux_source_directory(src SRC_FILES)

# 添加可執(zhí)行文件
add_executable(math_lib ${SRC_FILES})

6.2開發(fā)過程

在編寫代碼時,Clangd 的代碼補全功能讓編碼變得輕松愉悅。當我們在main.cpp中輸入add時,Clangd 會自動彈出補全提示,不僅列出add函數,還會顯示函數的參數列表和返回值類型,方便我們快速準確地調用函數 。而且,它還會根據上下文進行智能補全,比如當我們在math_operations.cpp中實現(xiàn)函數時,輸入類名和點號后,會立即列出該類的成員變量和函數,大大提高了編碼效率 。

實時診斷功能也十分貼心,在編寫math_operations.cpp時,如果不小心將return a + b;寫成return a + c;(假設沒有定義變量c),Clangd 會立刻在該行下方用波浪線標記錯誤,并給出詳細的診斷信息,告訴我們c未聲明,讓我們能及時發(fā)現(xiàn)并修正錯誤 。

在代碼導航方面,當我們想查看add函數的定義時,只需將光標放在add上,按下快捷鍵(如 F12),就能瞬間跳轉到math_operations.cpp中add函數的定義處;如果想知道add函數在哪些地方被調用,使用查找引用功能,就能快速列出main.cpp中調用add函數的位置 。

6.3問題解決

在開發(fā)過程中,有時會遇到 Clangd 無法識別頭文件的問題。比如在main.cpp中包含math_operations.h時,Clangd 卻提示找不到該頭文件。這可能是因為項目的編譯配置信息沒有正確傳遞給 Clangd,比如compile_commands.json文件生成不正確或路徑有誤 。

解決方法是首先確認compile_commands.json文件是否在項目根目錄或正確的位置,并且文件內容是否包含了所有源文件的正確編譯命令 。如果是使用 CMake 構建的項目,可以重新執(zhí)行cmake -DCMAKE_EXPORT_COMPILE_COMMANDS=ON ..命令,確保compile_commands.json文件正確生成 。如果項目中使用了自定義的頭文件路徑,還可以在 Clangd 的配置文件(如.clangd)中添加額外的包含路徑,比如:

CompileFlags:
  Add:
  - -I/path/to/include

將/path/to/include替換為實際的頭文件路徑,這樣 Clangd 就能正確識別頭文件了 。

6.4Clangd 與其他工具對比

(1)與微軟 C/C++ 插件對比

在 VS Code 的插件生態(tài)中,微軟官方的 C/C++ 插件曾是眾多開發(fā)者的首選,不過 Clangd 與之相比,有著獨特的優(yōu)勢 。在代碼補全方面,微軟插件雖然也能提供基本的補全建議,但在處理復雜的模板和泛型代碼時,常常顯得力不從心。比如在一個使用了多層模板嵌套的 C++ 項目中,微軟插件可能會出現(xiàn)補全不完整或不準確的情況 。而 Clangd 憑借其基于 Clang 編譯器對代碼語法和語義的深度解析,能夠精準地補全模板相關的代碼,即便是復雜的模板實例化也能給出正確的建議 。

在代碼診斷功能上,微軟插件主要依賴于自身的分析邏輯,有時對于一些深層次的類型錯誤或復雜的編譯期問題,診斷結果不夠詳細和準確 。Clangd 則直接利用 Clang 編譯器的診斷能力,能夠提供與實際編譯時幾乎一致的錯誤信息和警告,對于代碼中潛在的問題定位更加精準,幫助開發(fā)者更快地解決問題 。

(2)與其他語言服務器對比

在 C/C++ 語言服務器領域,除了 Clangd,還有 Ccls 等也頗受關注 。從性能角度來看,Clangd 在處理大型項目時表現(xiàn)出色。當面對一個包含大量源文件和復雜依賴關系的項目時,Ccls 在初始化和索引構建階段可能會消耗較多的內存和時間,導致編輯器響應速度變慢 。而 Clangd 通過優(yōu)化的算法和高效的資源管理,能夠快速完成項目的索引,在日常編碼過程中保持較低的資源占用,讓編輯器始終保持流暢 。

在功能完整性方面,Ccls 雖然也能提供代碼補全、導航等基本功能,但在對 C++ 新特性的支持上,相比 Clangd 略顯滯后 。比如對于 C++20 中的概念(Concepts)、模塊(Modules)等新特性,Clangd 能夠及時跟進并提供完善的代碼分析和智能提示,而 Ccls 可能需要一段時間才能對這些新特性提供全面支持。

責任編輯:武曉燕 來源: 深度Linux
相關推薦

2025-10-20 04:22:00

2011-01-14 12:53:45

Linux PPCEclipseC

2011-01-14 12:44:32

Linux PPCEclipseC

2010-02-24 09:45:10

Linux CC++

2015-11-11 15:19:13

Linux編譯調試

2012-09-21 10:30:56

Linux項目代碼覆蓋率

2021-06-02 08:13:28

VscodeVisual stduC++

2009-08-18 14:32:11

C#安裝部署

2020-12-07 10:42:22

VScodeC++

2012-09-05 09:04:36

C++SQLite

2020-05-26 13:25:00

語言編譯代碼

2009-06-05 14:54:09

EclipseC++環(huán)境搭建

2009-06-01 16:27:59

eclipse cdteclipse cdtc++

2010-01-11 09:28:34

C++編程

2022-04-22 15:06:59

C++PythonJava

2010-01-26 11:06:50

C++開發(fā)

2025-07-02 09:16:40

2010-01-27 13:53:40

強大的CC++編譯器

2013-06-24 15:32:00

c++GCC

2010-01-18 09:39:25

C++語言
點贊
收藏

51CTO技術棧公眾號