windows下使用vscode編寫運行以及調試C/C++

不要轉載,惟一出處tangming博客園html

最後更新於2019年8月12日:c++

本文本來爲我在一年多前在參加算法競賽期間於博客園發佈的一篇整理vscode編寫c/c++所有使用心得的文章,通過屢次的修改/訂正/完善受收到了不少朋友的關注和支持,很感謝你們,但這篇文章經歷屢次修改和添加,冗長而且混亂,我但願能從新組織一篇更加優質的文章並使用更適合於初學者的演示。而博客園在一些功能上存在必定侷限,所以我從新在知乎上另起了一篇更加美觀和易於閱讀的文章算法

 

新文章的地址是:https://zhuanlan.zhihu.com/p/77645306shell

-----------------------------下面是原文章---------------------------------json

vscdoe是一款稍有研究就會爲之驚歎的軟件windows

vscode支持相似於vs的斷點調試c/c++,也能夠直接編譯&運行c/c++函數

 

先是編譯運行 c/c++的方法                             測試

 

微軟官方起初設定的科學作法(這也是如今的科學作法)是經過在vscode集成控制檯寫命令行的方式來實現編譯運行程序的,但也能夠經過code runner插件來簡化步驟,實現一鍵編譯執行ui

但不管是什麼方法,由於vscode自己並不帶有編譯器,都須要本身提早安裝好一個c/c++編譯器(如mingw,clang)而且配置好環境變量(不會請點擊這裏)spa

控制檯下編譯運行C/C++(若是不懂命令行操做能夠暫時跳過這裏):

按 ctrl + ~ 打開vscode控制檯,點擊終端,在vscode的終端下操做其實就是在windows下的cmd或者powershell下操做,一切的編譯運行等操做能夠用輸入命令行的方式來實現,只要掌握各自的編譯器的命令行指令就能讓程序在vscode界面上運行起來

c/c++編譯器的那一套天然不在話下(以下圖),先用cd 命令切換到源文件目錄或者直接輸入完整路徑名,而後用編譯器指令(假設編譯器是mingw) g++ xxx.cpp -o xxx.exe編譯,接着再輸入./xxx.exe就能夠運行編譯好的程序

其餘的c/c++編譯器如clang包括其餘語言(Python ,Go,Java...)均可以相似的這樣操做

 

 

 

便捷方式是使用code runner插件:

code runner插件默認的c/c++編譯器是gcc/g++,須要提早安裝好而且設置好環境變量,一般選擇MinGW或者MinGW-w64,建議選mingw-w64,通常用戶建議下載離線版解壓後添加環境變量,離線版下載地址:連接

不會請看:安裝mingw-w64具體過程

同時,code runner插件使用的編譯器是能夠被修改成gcc/g++之外的編譯器的(好比clang,MSVC),有這方面須要請看:vscode修改code runner使用的編譯器

mingw和mingw-w64是有區別的,直觀的說,mingw-w64更增強大

安裝好而且設置好兩者中的一個,並設置好環境變量後在cmd下輸入gcc -v確認是否成功,出現關於gcc -v的相關信息(以下圖)就表示成功

 

接着點擊vscode左側面板中的插件商店按鈕

安裝好下面兩個插件

C/C++

Code runner

若是須要中文請安裝一個chinese插件

 

注意,若是沒安裝clang的話不要安裝推薦插件裏的c/c++ clang插件,不然應該會報錯

 

安裝好後重啓一下vscode這樣就能在右上角看見一個三角形了,打開文件點擊就能編譯執行

但此時會有這樣一個問題

若是程序裏有scanf()等請求鍵盤輸入數據的函數,此時沒法從鍵盤輸入數據,而且程序沒法結束須要關閉重啓vscode才能從新執行

 

 

解決辦法是依次打開:文件>首選項>設置>用戶設置>拓展>Run Code Configuration

找到  Run In Terminal  打上勾 這樣運行的程序就會運行在vscode的集成控制檯上

在工做區設置也有這個選項,但工做區設置只會對工做區生效

這樣問題就能解決了

 運行一段測試代碼

#include<bits/stdc++.h>  
using namespace std;  
  
int main(){  
    cout<<"hello"<<endl;  
    int u;  
    while(cin>>u){  
        cout<<u*u<<endl;  
    }  
}  

 

這時輸出信息會顯示在終端欄下面

隨便輸入測試數據

能夠看到下圖的效果

 

點擊右上角的垃圾桶能提早結束程序運行

code runner插件有一個侷限,code runner插件的原理實際上是自動在控制檯下幫助咱們輸入g++ xxx.cpp -o xxx.exe(假設是默認狀況)這條編譯指令,不會再添加額外的命令,好比若是代碼中使用了winsock2用g++編譯的話須要額外添加-lwsock32指令,即完整指令爲g++ xxx.cpp -o xxx.exe -lwsock32,此時直接使用code runner的話會沒法編譯,這種狀況應該使用上面提到的vscode集成控制檯手動輸入編譯指令編譯

 

調試 c/c++方法          

首先一點:不支持中文路徑!!!(文件名和整個文件路徑名中都不能有中文,不然沒法調試,是由mingw不支持中文路徑形成的)

實際效果相似vs那樣按f5斷點調試

首先選中一個用於存放各類代碼的文件夾做爲根路徑也就是工做區,由於調試只會對根路徑下的文件生效!!!

在vscode中打開這個文件夾(文件>打開文件夾>選中你的文件夾)

以後再在這個文件夾新建一個 .vscode 的文件夾,不要忘了開頭的 "." 號(若是已有則沒必要再額外新建)

再在.vscode文件夾中新建兩個配置文件 launch.json 和 tasks.json

相似於下圖

 

以後再把下面的兩個段代碼粘貼到對應的文件裏

這裏須要修改一處:launch中 "miDebuggerPath" 選項須要設置爲你的調試器(gdb.exe)所在位置 這裏的是我電腦上MinGW -w64的安裝位置

不管安裝的是MinGW仍是mingw-w64,都會有一個gdb.exe在安裝目錄的bin文件夾下,必定要把對應的路徑修正不然沒法調試

launch.json

{
    "version": "0.2.0",
    "configurations": [
        {
            "name": "C/C++",
            "type": "cppdbg",
            "request": "launch",
            "program": "${fileDirname}/${fileBasenameNoExtension}.exe",
            "args": [],
            "stopAtEntry": false,
            "cwd": "${workspaceFolder}",
            "environment": [],
            "externalConsole": true,
            "MIMode": "gdb",
            "miDebuggerPath": "C:/Program Files/mingw64/bin/gdb.exe",
            "preLaunchTask": "g++",
            "setupCommands": [
                {
                    "description": "Enable pretty-printing for gdb",
                    "text": "-enable-pretty-printing",
                    "ignoreFailures": true
                }
            ],
        },
    ]
}

tasks.json

{
    "version": "2.0.0",
    "command": "g++",
    "args": [
        "-g",
        "${file}",
        "-o",
        "${fileDirname}/${fileBasenameNoExtension}.exe"
    ],
    "problemMatcher": {
        "owner": "cpp",
        "fileLocation": [
            "relative",
            "${workspaceRoot}"
        ],
        "pattern": {
            "regexp": "^(.*):(\\d+):(\\d+):\\s+(warning|error):\\s+(.*)$",
            "file": 1,
            "line": 2,
            "column": 3,
            "severity": 4,
            "message": 5
        }
    },
    "group": {
        "kind": "build",
        "isDefault": true
    }
}

以後打開在當前工做區子目錄下的.c/cpp文件就能夠添加斷點進行調試了

此時能夠按 ctrl+shift+b 直接調用配置好的g++ task 編譯程序而不運行程序,相似於一些IDE的編譯選項

若是咱們要查看當前某個變量的值或者某個表達式的值,能夠像vs同樣在左側的調試面板添加監視

也能夠在下方的調試控制檯裏直接輸入表達式或者變量名

固然,最簡單的仍是鼠標直接移動到變量上,每每直接就顯示出來了,若是靠這樣不能解決的話,就試試上面兩種方法

 

vscode支持實時報錯,遇到找不到頭文件的問題請點擊 

 

 

也可讓c/c++程序的調試在vscode的集成控制檯上進行,不在額外顯示黑窗口,相似於code runner的界面效果

只需將launch.json中的 "externalConsole" 項由 true 改成 false 

經評論區提醒

此時可能會遇到這樣一個問題,若是你的輸入法當前是中文輸入的話,輸入數據時會很長時間才能反應過來,只須要按shift將輸入法切換到英文狀態就不會遇到這個問題了,能夠直接設置輸入法首選項爲英文

效果

相似於code runner的問題: 若是是須要有額外的編譯指令如-lwsock32,須要調試前事先在tasks.json的args處添加上對應的指令,或者用 // 註釋掉launch.json中的 preLaunchTask:"g++"(啓動調試前執行g++編譯按tasks指令格式編譯) 這一項,而後本身在按ctrl + ~ 打開終端手動編譯好後再執行調試

 

記住:調試是屬於工做區設置,當前配置的調試環境只會對當前.vscode文件夾所在路徑下的文件生效,若是要換用別的文件夾,把.vscode這個文件夾拷貝過去便可

 

最後,我使用的主題插件爲tangming Themes,感興趣的能夠去插件商店下載,裏面一共四個主題

 

彷佛有不少打ACM的同窗在看,再提醒一點,在上面提到集成終端下調試,將題目測試數據粘貼到命令行,測試到一半就發現問題,點從新啓程調試的按鈕,會由於剩餘的數據未被讀取而形成錯誤

好比這樣的錯誤信息:

所在位置 行:1 字符: 2
+ 5& 'c:\Users\tangm\.vscode\extensions\ms-vscode.cpptools-0.24.1\debug ...
+  ~
表達式或語句中包含意外的標記「&」。
    + CategoryInfo          : ParserError: (:) [], ParentContainsErrorRecordException
    + FullyQualifiedErrorId : UnexpectedToken

正常現象,再從新點一下啓動就能夠了

相關文章
相關標籤/搜索