我是從開始學C++的時候就一直用的是visual studio,畢竟宇宙第一IDE,寫和調試都是超級方便快捷,唯一的缺點可能就是啓動慢一點。 之前電腦沒有換固態之前,用過一段時間的codeblocks,換了之後就一直用VS了。 這次換vscode的原因主要是因爲最近看到CPP的一些細節的東西的時候發現VS會完全忽略掉這些錯誤和警告。 印象最深的是關於函數返回局部指針變量的處理: eg:
char * fun() { char *p = "hello"; return p; }
這個函數輸入到VS裏面是完全沒有警告和錯誤的,在主函數裏調用也會輸出hello
。
但是實際上CPP是不建議把字符串常量賦值給非常量字符指針的(C語言中不會報錯)。同樣的代碼在VScode選擇clang編譯就會出現警告。
還有:return p;
這個是有內存風險的,局部指針創建的對象在棧上,返回p的時候函數調用完畢,指針被賦值給其他全局變量的話,棧上空間就會被釋放掉,所以這個也是有警告的。
不過上面這兩個東西放在VS裏面都是可以通過的。
所以啊,裝了個VScode來寫一些簡單的CPP項目,以避免類似的一些簡單的不好的編程習慣,而且後面的工作的話估計也不會是在VS下開發的,提前熟悉一下。
廢話少說,參考的是:VSCODE配置C/C++編譯調試環境。有一些小坑,嘗試之後最直接簡單的方法如下:
1. 下載VS Code並安裝。
地址:https://code.visualstudio.com/
VS Code是一個輕量級開源的跨平臺代碼編輯器,可以運行在win,Mac OS以及Linux系統上,爲各種常見語言(C/Cpp,Java,C#,Python,Go等)提供豐富的擴展生態系統的運行平臺。 win下安裝沒什麼說的,一步一步安裝就可以了。
2.安裝LLVM以及MinGW
- LLVM LLVM是構架編譯器(compiler)的框架系統,以C++編寫而成,用於優化以任意程序語言編寫的程序的編譯時間(compile-time)、鏈接時間(link-time)、運行時間(run-time)以及空閒時間(idle-time),對開發者保持開放,併兼容已有腳本。 地址:http://releases.llvm.org/download.html
然後安裝,也比較簡單,選擇一個安裝路徑就好了,然後會提示是否選擇添加環境變量,選擇Add LLVM to the system PATH for all users
.
- MinGw 地址1:https://sourceforge.net/projects/mingw-w64/ 地址2:鏈接:https://pan.baidu.com/s/1NEadtRs2SUIuJaeJ8hpAsQ 提取碼:2l9h 地址1下載來的安裝程序安裝時需要下載組件,可能出現問題,我是校園網所以沒下載下來,如果可以下載的話可以使用這種方式。 地址2中是安裝好的一個免安裝的壓縮包,只需要解壓到對應位置即可。
- 添加環境變量。
法1. 把min GW的bin文件夾的路徑添加到環境變量之中。
重啓之後,
Win+r
輸入cmd打開命令行,分別輸入gcc和clang後回車。
出現如上所示的提示認爲安裝成功。 法2. 可以把MinGW中的所有文件拷貝到安裝的LLVM路徑下,兩者會無縫合並,如圖:
然後和上面說的一樣,檢測是否安裝成功。
3.安裝VS Code擴展。
- C/C++
- C/C++ Clang Command Adapter:提供靜態檢測(Lint),很重要.
- Code Runner:右鍵即可編譯運行單文件,很方便
4. 配置4個.json文件。
這個配置文件我基本上都是按照知乎上面的下來的,只有很少的地方需要修改。
- 建立工作區。 這一步在文件管理器中建立就可以了。
- 建立
.vscode
配置文件夾。 在VS Code的文件管理器中找到新建文件夾的按鍵。
- 建立配置文件。
一共四個文件,在
.vscode
文件夾下建立四個文件,主需要單擊新建文件的按鈕就可以了。launch.json,tasks.json,settings.json,c_cpp_properties.json
配置分別如下: launch.json
// https://github.com/Microsoft/vscode-cpptools/blob/master/launch.md { "version": "0.2.0", "configurations": [ { "name": "(gdb) Launch", // 配置名稱,將會在啓動配置的下拉菜單中顯示 "type": "cppdbg", // 配置類型,這裏只能爲cppdbg "request": "launch", // 請求配置類型,可以爲launch(啓動)或attach(附加) "program": "${fileDirname}/${fileBasenameNoExtension}.exe", // 將要進行調試的程序的路徑 "args": [], // 程序調試時傳遞給程序的命令行參數,一般設爲空即可 "stopAtEntry": false, // 設爲true時程序將暫停在程序入口處,我一般設置爲true "cwd": "${workspaceFolder}", // 調試程序時的工作目錄 "environment": [], // (環境變量?) "externalConsole": true, // 調試時是否顯示控制檯窗口,一般設置爲true顯示控制檯 "internalConsoleOptions": "neverOpen", // 如果不設爲neverOpen,調試時會跳到“調試控制檯”選項卡,你應該不需要對gdb手動輸命令吧? "MIMode": "gdb", // 指定連接的調試器,可以爲gdb或lldb。但目前lldb在windows下沒有預編譯好的版本。 "miDebuggerPath": "gdb.exe", // 調試器路徑,Windows下後綴不能省略,Linux下則去掉 "setupCommands": [ // 用處未知,模板如此 { "description": "Enable pretty-printing for gdb", "text": "-enable-pretty-printing", "ignoreFailures": false } ], "preLaunchTask": "Compile" // 調試會話開始前執行的任務,一般爲編譯程序。與tasks.json的label相對應 } ] }
tasks.json
// https://code.visualstudio.com/docs/editor/tasks { "version": "2.0.0", "tasks": [ { "label": "Compile", // 任務名稱,與launch.json的preLaunchTask相對應 "command": "clang++", // 要使用的編譯器 "args": [ "${file}", "-o", // 指定輸出文件名,不加該參數則默認輸出a.exe,Linux下默認a.out "${fileDirname}/${fileBasenameNoExtension}.exe", "-g", // 生成和調試有關的信息 "-Wall", // 開啓額外警告 "-static-libgcc", // 靜態鏈接 "-fcolor-diagnostics", // 彩色的錯誤信息?但貌似clang默認開啓而gcc不接受此參數 "--target=x86_64-w64-mingw", // clang的默認target爲msvc,不加這一條就會找不到頭文件;Linux下去掉這一條 "-std=c++17" // C語言最新標準爲c11,或根據自己的需要進行修改 ], // 編譯命令參數 "type": "shell", // 可以爲shell或process,前者相當於先打開shell再輸入命令,後者是直接運行命令 "group": { "kind": "build", "isDefault": true // 設爲false可做到一個tasks.json配置多個編譯指令,需要自己修改本文件,我這裏不多提 }, "presentation": { "echo": true, "reveal": "always", // 在“終端”中顯示編譯信息的策略,可以爲always,silent,never。具體參見VSC的文檔 "focus": false, // 設爲true後可以使執行task時焦點聚集在終端,但對編譯c和c++來說,設爲true沒有意義 "panel": "shared" // 不同的文件的編譯信息共享一個終端面板 } // "problemMatcher":"$gcc" // 如果你不使用clang,去掉前面的註釋符,並在上一條之後加個逗號。照着我的教程做的不需要改(也可以把這行刪去) } ] }
c_cpp_properties.json
{ "configurations": [ { "name": "MinGW", "intelliSenseMode": "clang-x64", "compilerPath": "C:/Program Files/LLVM/bin/gcc.exe", "includePath": [ "${workspaceFolder}" ], "defines": [], "browse": { "path": [ "${workspaceFolder}" ], "limitSymbolsToIncludedHeaders": true, "databaseFilename": "" }, "cStandard": "c11", "cppStandard": "c++17" } ], "version": 4 }
settings.json
{ "files.defaultLanguage": "cpp", // ctrl+N新建文件後默認的語言 "editor.formatOnType": true, // 輸入時就進行格式化,默認觸發字符較少,分號可以觸發 "editor.snippetSuggestions": "top", // snippets代碼優先顯示補全 "code-runner.runInTerminal": true, // 設置成false會在“輸出”中輸出,無法輸入 "code-runner.executorMap": { "c": "cd $dir && clang $fileName -o $fileNameWithoutExt.exe -Wall -g -Og -static-libgcc -fcolor-diagnostics --target=x86_64-w64-mingw -std=c11 && $dir$fileNameWithoutExt", "cpp": "cd $dir && clang++ $fileName -o $fileNameWithoutExt.exe -Wall -g -Og -static-libgcc -fcolor-diagnostics --target=x86_64-w64-mingw -std=c++17 && $dir$fileNameWithoutExt" }, // 設置code runner的命令行 "code-runner.saveFileBeforeRun": true, // run code前保存 "code-runner.preserveFocus": true, // 若爲false,run code後光標會聚焦到終端上。如果需要頻繁輸入數據可設爲false "code-runner.clearPreviousOutput": false, // 每次run code前清空屬於code runner的終端消息 "C_Cpp.clang_format_sortIncludes": true, // 格式化時調整include的順序(按字母排序) "C_Cpp.intelliSenseEngine": "Default", // 可以爲Default或Tag Parser,後者較老,功能較簡單。具體差別參考cpptools擴展文檔 "C_Cpp.errorSquiggles": "Disabled", // 因爲有clang的lint,所以關掉 "C_Cpp.autocomplete": "Disabled", // 因爲有clang的補全,所以關掉 "clang.cflags": [ // 控制c語言靜態檢測的參數 "--target=x86_64-w64-mingw", "-std=c11", "-Wall" ], "clang.cxxflags": [ // 控制c++靜態檢測時的參數 "--target=x86_64-w64-mingw", "-std=c++17", "-Wall" ], "clang.completion.enable":true // 效果效果比cpptools要好 }
settings
這個文件在建立之後就會出現許多關於setting的解釋和如何賦值,可以根據自己的情況來設置:
至此就配置結束了,可以重啓一下機器(我沒有重啓也是可以的)。
5.測試。
邏輯是這樣的:
工作區下面是配置文件,以及其他的工程文件,每個工程最好都新建一個文件夾,然後在文件夾下面新建cpp
或h
文件進行程序編寫:
比如這裏編寫了一個簡單的helloworld程序,在編輯區右鍵run code
就可以了。調試的話選擇debug自己設置斷點都很方便。
至此大功告成!!