Visual Studio Code 如何編寫運行 C、C++ 程序蒲列?

0. 前言

本文面向初學者窒朋,但是不適合還在學寫Hello World級別的初學者。閱讀本文能在一定程度上了解程序編譯的知識蝗岖,以及使用VS Code的知識侥猩。

本文大部分內(nèi)容都可從VS Code官方文檔:C++ programming with Visual Studio Code以及各個擴展的文檔中獲得,并且他們還會進行更新(本文也進行過幾次重大更新)抵赢。如果你想更深入了解欺劳,可以去看。其實本文基本上是由不斷地嘗試得出來的铅鲤,如果有錯誤可以指出划提。

我的環(huán)境:64位Windows 10。32位Win在某些地方需要修改邢享,不過本文沒有提鹏往;Linux下也有許多不同,僅供參考驼仪。

最終效果:實時顯示編譯階段的錯誤掸犬、格式化代碼、進行單文件的編譯與調(diào)試绪爸。

1. 環(huán)境的準備

VSC的官網(wǎng)、下載宙攻、安裝奠货,我就不多說了。VSC只是一個編輯器(editor)座掘,不是IDE(集成開發(fā)環(huán)境)递惋,不含編譯器(compiler)和許多其它功能柔滔,所以編譯器要自己裝好。

其實MinGW和MinGW-w64只是名字像萍虽,它們是兩個不同的項目睛廊。為了方便,本文中的MinGW指的其實都是MinGW-w64杉编。MinGW本身已經(jīng)很久沒有更新了超全,故不推薦。下載以下兩個程序(都要):

LLVM Download Page在此頁面下載Clang邓馒。選 Pre-Built Binaries 中的 Windows (64-bit)嘶朱,不需要下.sig文件

MinGW-w64 - for 32 and 64 bit Windows在此頁面下載 MinGW-w64,往下稍微翻一下光酣,選最新版本中的x86_64-posix-seh疏遏。最好不要用 Download Latest Version,這個是在線安裝包救军,有可能因為國內(nèi)的“網(wǎng)絡環(huán)境”下載失敗财异。如果瀏覽器還是下載失敗就換迅雷下,還失敗唱遭,那就使用能訪問Google的那種方法下宝当。

安裝Clang:添加環(huán)境變量時,選Add LLVM to the system PATH for all users(即第二項胆萧,不過第三項也差不多)庆揩;路徑我填的是C:\LLVM,也可以保持默認或者自己改跌穗。

安裝MinGW-w64:下下來的是一個7z的壓縮包订晌,隨便解壓到哪,把東西全部復制(或者直接剪切)到Clang的文件夾里去(除非你有自己的想法)蚌吸,它們會無沖突合并锈拨,然后就可以把它刪了:


驗證

運行cmd,輸clang或gcc羹唠,應該會提示no input files而不是“不是內(nèi)部命令或外部命令”或者“無法將“clang”項識別為 cmdlet奕枢、函數(shù)、腳本文件或可運行程序的名稱”佩微,見下圖缝彬。如果是“不是內(nèi)部命令或外部命令”,說明clang.exe在的文件夾(我圖里的是C:\LLVM\bin)沒有在環(huán)境變量中哺眯,要加到Path里才行谷浅。如果加了還是這樣腾务,重啟泥耀。

輸clang -v或gcc -v可以顯示出各自的版本。如果顯示出來的版本與你剛下的不同/更老,說明Path里原本有老版本的編譯器握爷,可能是安裝其它IDE時裝上的锤躁。則需要去掉原來的粘舟。

這兩項驗證一定要符合宫盔。如果你不知道怎么修改環(huán)境變量可以自己百度或者b站搜“環(huán)境變量”看視頻(大多不是C的但是區(qū)別不大)。



輸入gcc -v的最后一行輸出眉睹,版本要和你自己下的對應荔茬,要有x86_64和seh;sjlj是以前的辣往,圖懶得改了

安裝擴展(extension)

必裝:

C/C++:又名 cpptools兔院,提供Debug和Format功能

C/C++ Clang Command Adapter:提供靜態(tài)檢測(Lint)功能

Code Runner:右鍵即可編譯運行單文件,很方便站削;但無法Dubug

其他可選擴展:

Bracket Pair Colorizer:彩虹花括號

Include Autocomplete:提供頭文件名字的補全坊萝,不過用處不大;而且其實現(xiàn)在cpptools已經(jīng)自帶這個功能了许起,但本文不使用它的補全

C/C++ Snippets:Snippets即重用代碼塊十偶,效果自己百度;這個擴展安裝量雖高园细,不過個人感覺用處實在不大惦积,你也可以選擇其他的Snippets擴展甚至自己定義

One Dark Pro:大概是VS Code安裝量最高的主題

vscode-clangd:這個和Adapter二選一,出得比Adapter晚猛频,下載量也低狮崩,但卻是llvm官方出的。出現(xiàn)問題時可以換著試試

Clang-Format:只有想自定義代碼風格時才裝鹿寻,比如大括號不換行睦柴。需要另外學習如何使用

不建議/不需要裝的擴展:

GBKtoUTF8:把GBK編碼的文檔轉(zhuǎn)換成UTF8編碼的。此擴展可能有嚴重的bug毡熏。

C++ Intellisense:用的是gtags坦敌,本文第一個版本的選擇。效果非常非常一般痢法。

FAQ

Q: 為什么要裝Clang?

A: 錯誤提示更友好狱窘。以及:Clang 比 GCC 好在哪里?

Q: Clang怎么讀财搁?

A: 正確答案是/?kl??/蘸炸,即c發(fā)"可"的音;不過實際還是以雙方都理解為基礎妇拯,比如平常把SQL說成circle也是能理解的

Q: 為什么既要裝Clang又要裝MinGW?

A: Clang沒有stdio.h等頭文件幻馁。至于為什么沒有洗鸵,我就不知道了越锈;也許就是下一點的原因

Q: MSVC integration install failed / unable to find a Visual Studio installation...

A: Win下的Clang默認用的是MSVC的后端仗嗦。如果完全按照本文接下來的操作,不用管這個提示


2. 配置四個.json文件

先創(chuàng)建一個你打算存放代碼的文件夾(稱作工作區(qū))甘凭,路徑不能含有中文和引號稀拐,最好不要有空格。C和C++需要分別建立不同的工作區(qū)丹弱,除非你懂得下面json文件的某些選項德撬,則可以做到一個工作區(qū)使用不同的build task。

打開VSC躲胳,選打開文件夾蜓洪,不要選“添加工作區(qū)文件夾”,理由見上一句坯苹。點新建文件夾隆檀,名稱為.vscode。這樣操作的原因是Windows的Explorer不允許創(chuàng)建的文件夾第一個字符是點(但據(jù)說1809的下一個大版本支持了)粹湃。然后創(chuàng)建 launch.json恐仑,tasks.json,settings.json为鳄,c_cpp_properties.json放到.vscode文件夾下裳仆,效果圖:



復制以下代碼出來后,知乎會自動在前面加上幾行保留所有權利的字孤钦,實際使用的時候肯定要刪了的歧斟。每個小節(jié)的開頭都有選項說明。特別提示:默認F5只能編譯C偏形,如果你要調(diào)試C++静袖,必需改tasks.json,具體參見小節(jié)說明壳猜。

launch.json代碼

stopAtEntryexternalConsole可根據(jù)自己喜好修改勾徽;cwd可以是程序運行時的相對路徑,如有需要可以改為${fileDirname}统扳;現(xiàn)在的LLVM帶有l(wèi)ldb-vscode這個程序喘帚,但我沒試過能不能用。其他無需更改咒钟。type和request不變色是正炒涤桑現(xiàn)象。

//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",//將要進行調(diào)試的程序的路徑

"args":[],//程序調(diào)試時傳遞給程序的命令行參數(shù),一般設為空即可

"stopAtEntry":false,//設為true時程序?qū)和T诔绦蛉肟谔幬谖簦喈斢谠趍ain上打斷點

"cwd":"${workspaceFolder}",//調(diào)試程序時的工作目錄隙疚,此為工作區(qū)文件夾;改成${fileDirname}可變?yōu)槲募谀夸?/p>

"environment":[],//環(huán)境變量

"externalConsole":true,//為true時使用單獨的cmd窗口磕道,與其它IDE一致供屉;18年10月后設為false可調(diào)用VSC內(nèi)置終端

"internalConsoleOptions":"neverOpen",//如果不設為neverOpen,調(diào)試時會跳到“調(diào)試控制臺”選項卡溺蕉,你應該不需要對gdb手動輸命令吧伶丐?

"MIMode":"gdb",//指定連接的調(diào)試器,可以為gdb或lldb疯特。但我沒試過lldb

"miDebuggerPath":"gdb.exe",//調(diào)試器路徑哗魂,Windows下后綴不能省略,Linux下則不要

"setupCommands":[//用處未知漓雅,模板如此

{

"description":"Enable pretty-printing for gdb",

"text":"-enable-pretty-printing",

"ignoreFailures":false

}

],

"preLaunchTask":"Compile"http://調(diào)試會話開始前執(zhí)行的任務录别,一般為編譯程序。與tasks.json的label相對應}]}

tasks.json代碼

如果是編寫C++故硅,編譯器需改成clang++庶灿;如果想用MinGW就分別是gcc和g++,但注意把--target那條刪去吃衅。

如果不想要額外警告往踢,把-Wall那一條刪去。

reveal可根據(jù)自己喜好修改徘层,即使設為never峻呕,也只是編譯時不跳轉(zhuǎn)到“終端”而已,手動點進去還是可以看到趣效,我個人設為never瘦癌。

參數(shù)的作用我加了注釋,還看不懂跷敬,百度gcc使用教程讯私。

//https://code.visualstudio.com/docs/editor/tasks

{

"version":"2.0.0",

"tasks":[

{

"label":"Compile",//任務名稱,與launch.json的preLaunchTask相對應

"command":"clang",//要使用的編譯器西傀,C++用clang++斤寇;如果編譯失敗,改成gcc或g++試試拥褂,還有問題那就是你自己的代碼有錯誤"

args":[

"${file}",

"-o",//指定輸出文件名娘锁,不加該參數(shù)則默認輸出a.exe,Linux下默認a.out

"${fileDirname}/${fileBasenameNoExtension}.exe",

"-g",//生成和調(diào)試有關的信息

"-Wall",//開啟額外警告

"-static-libgcc",//靜態(tài)鏈接libgcc

"--target=x86_64-w64-mingw",//clang的默認target為msvc饺鹃,不加這一條就會找不到頭文件莫秆;Linux下去掉這一條

"-std=c11"http://C++最新標準為c++17间雀,或根據(jù)自己的需要進行修改

],//編譯命令參數(shù)

"type":"process",//process是vsc把預定義變量和轉(zhuǎn)義解析后直接全部傳給command;shell相當于先打開shell再輸入命令镊屎,所以args還會經(jīng)過shell再解析一遍

"group":{

"kind":"build",

"isDefault":true//設為false可做到一個tasks.json配置多個編譯指令惹挟,需要自己修改本文件,我這里不多提},

"presentation":{

"echo":true,

"reveal":"always",//在“終端”中顯示編譯信息的策略杯道,可以為always匪煌,silent责蝠,never党巾。具體參見VSC的文檔

"focus":false,//設為true后可以使執(zhí)行task時焦點聚集在終端,但對編譯c和c++來說霜医,設為true沒有意義

"panel":"shared"http://不同的文件的編譯信息共享一個終端面板

}

//"problemMatcher":"$gcc"http://如果你不使用clang齿拂,去掉前面的注釋符,并在上一條之后加個逗號肴敛。照著我的教程做的不需要改(也可以把這行刪去)

}

]

}

settings.json代碼

把這個文件里的東西放到“用戶設置”里也可以覆蓋全局設置署海,自己進行選擇。

Code Runner的命令行和某些選項可以根據(jù)自己的需要在此處修改医男,用法還是參見此擴展的文檔和百度gcc使用教程砸狞。Win7需要用注釋掉的命令行,或者把terminal.integrated.shell.windows改為PowerShell镀梭。

如果你要使用其他地方的頭文件和庫文件刀森,需要要往clang.cflags和clang.cxxflags里加-I、-l和-L报账,用法百度gcc使用教程研底。

clang的補全,在我過去的測試過程中會讓VSC非惩赴眨卡榜晦,但是現(xiàn)在好像沒有這個問題了。如果你卡羽圃,就把clang的補全關掉乾胶,用cpptools的(不需要我指明分別是哪兩個吧?)朽寞。

Linux下記得去掉code runner和flags的--target识窿,共四個。


提到的snippetSuggestions愁憔。

{

"files.defaultLanguage":"c",//ctrl+N新建文件后默認的語言

"editor.formatOnType":true,//輸入時就進行格式化腕扶,默認觸發(fā)字符較少,分號可以觸發(fā)

"editor.snippetSuggestions":"top",//snippets代碼優(yōu)先顯示補全

"code-runner.runInTerminal":true,//設置成false會在“輸出”中輸出吨掌,無法輸入

"code-runner.executorMap":{

"c":"cd $dir && clang '$fileName' -o '$fileNameWithoutExt.exe' -Wall -g -O2 -static-libgcc --target=x86_64-w64-mingw -std=c11 && &'$dir$fileNameWithoutExt'",

"cpp":"cd $dir && clang++ '$fileName' -o '$fileNameWithoutExt.exe' -Wall -g -O2 -static-libgcc --target=x86_64-w64-mingw -std=c++17 && &'$dir$fileNameWithoutExt'"

//"c":"cd $dir && clang $fileName -o $fileNameWithoutExt.exe -Wall -g -O2 -static-libgcc --target=x86_64-w64-mingw -std=c11 && $dir$fileNameWithoutExt",

//"cpp":"cd $dir && clang++ $fileName -o $fileNameWithoutExt.exe -Wall -g -O2 -static-libgcc --target=x86_64-w64-mingw -std=c++17 && $dir$fileNameWithoutExt"},

//控制coderunner命令半抱;未注釋的僅適用于PowerShell(Win10默認)脓恕,注釋掉的適用于cmd(win7默認)

"code-runner.saveFileBeforeRun":true,//runcode前保存

"code-runner.preserveFocus":true,//若為false,runcode后光標會聚焦到終端上窿侈。如果需要頻繁輸入數(shù)據(jù)可設為false

"code-runner.clearPreviousOutput":false,//每次runcode前清空屬于coderunner的終端消息

"code-runner.ignoreSelection":true,//默認為false炼幔,效果是鼠標選中一塊代碼后可以單獨執(zhí)行,但C是編譯型語言史简,不適合這樣用

"C_Cpp.clang_format_sortIncludes":true,//格式化時調(diào)整include的順序(按字母排序)

"C_Cpp.intelliSenseEngine":"Default",//可以為Default或TagParser乃秀,后者較老,功能較簡單圆兵。具體差別參考cpptools擴展文檔

"C_Cpp.errorSquiggles":"Disabled",//因為有clang的lint跺讯,所以關掉

"C_Cpp.autocomplete":"Disabled",//因為有clang的補全,所以關掉

"clang.cflags":[//控制c語言靜態(tài)檢測的參數(shù)

"--target=x86_64-w64-mingw",

"-std=c11",

"-Wall"

],

"clang.cxxflags":[//控制c++靜態(tài)檢測時的參數(shù)

"--target=x86_64-w64-mingw",

"-std=c++17",

"-Wall"

],

"clang.completion.enable":true//效果比cpptools要好

}

c_cpp_properties.json代碼

如果你確定不需要使用別人的庫殉农,則現(xiàn)在的版本不需要創(chuàng)建這個文件了刀脏,擴展會自動使用默認的設置。

如果你自己編寫了頭文件又不在workspaceFolder下超凳,或是使用別人的庫愈污,路徑就要加到includePath和browse里(不過還有別的操作要做,見下一大點的多文件編譯)轮傍。如果需要遞歸包含暂雹,末尾加/**

此文件內(nèi)容來自于Microsoft/vscode-cpptools;這個json不允許有注釋(其實按照標準本來就不能有)创夜。

如果沒有合并Clang和MinGW杭跪,則該文件中的compilerPath必需修改成MinGW的完整路徑,精確到gcc.exe挥下,否則會提示找不到頭文件揍魂;Linux下是/usr/bin/gcc。

Windows下的目錄分隔符為反斜杠棚瘟,原本應使用兩個反斜杠來轉(zhuǎn)義现斋,但直接用斜杠在VS Code中也接受。

When you set thecompilerPathproperty and changeintelliSenseModetoclang-x64(orgcc-x64in version 0.18.0 and higher), you no longer need to copy the system include path or defines toincludePath,browse.path, ordefinesto enable IntelliSense to work properly.

{

"configurations":[

{

"name":"MinGW",

"intelliSenseMode":"gcc-x64",

"compilerPath":"C:/LLVM/bin/gcc.exe",

"includePath":[

"${workspaceFolder}"

],

"defines":[],

"browse":{

"path":[

"${workspaceFolder}"

],"limitSymbolsToIncludedHeaders":true,

"databaseFilename":""

},

"cStandard":"c11",

"cppStandard":"c++17"

}

],

"version":4

}

為什么要往json里寫這么多的東西偎蘸?因為VSC本身并沒有對C語言特別優(yōu)待庄蹋,對其他許多語言也是這樣。以$開頭的是VSC預定義的變量迷雪,具體參見:Variables Reference限书,比如$file在實際運行時會替換成當前打開的文件名。

3. 寫代碼章咧,編譯倦西,調(diào)試

新建文件后就可以寫代碼了,c語言源代碼后綴是.c赁严,c++是.cpp或.C或.cxx(這也要我教嗎……)扰柠。代碼文件在保存工作區(qū)內(nèi)都可以粉铐,可以自己建立文件夾,不必放到.vscode文件夾里卤档,不要含有中文和引號蝙泼,最好不要有空格;主要是許多符號是有效的shell語法劝枣,不然試試用rm刪除一個叫做-rf的文件汤踏?

按Alt+Shift+F(或者右鍵菜單)可以格式化代碼。出現(xiàn)Intellisense的時候按tab可以補全代碼舔腾。

停止輸入一小段時間(一秒)后就會有Lint溪胶,擴展會給一些建議性的warning(比如聲明了變量但不使用),自己清楚就行琢唾。如果覺得不爽载荔,也有方法不讓它提示,比如去掉-Wall就會少一些采桃。如果還想去掉更多的警告,自己找怎么做丘损,我提示一下:-Wno-...普办。找好參數(shù)后加到clang.cflags、clang.cxxflags和tasks.json的args里徘钥。

按ctrl+shift+B單純編譯衔蹲,按F5為運行并調(diào)試(運行前會自動編譯);本來ctrl+F5為運行但不調(diào)試呈础,但是在cpptools暫不支持舆驶,還是會調(diào)試。Follow:How to launch an application without debugging? · Issue #1201 · Microsoft/vscode-cpptools

在寫程序初期而钞,我強烈建議不要把f5當作編譯來使用沙廉,因為有的bug只會產(chǎn)生警告,不會阻止編譯臼节,但這些東西越早期解決越好撬陵。編譯信息會在底下的“終端”面板里,如果代碼有錯誤网缝,點進去可以看clang報的信息巨税,但因為有Lint了,所以可以輕松很多粉臊。

加斷點在列號前面點一下就行草添,如果想從一開始就停下來,可以加在main函數(shù)那里扼仲,或者launch.json中設置"stopAtEntry": true远寸。按f11可以一步一步進行促王,箭頭所指的那行代碼就是下一步要運行的代碼。左邊有個調(diào)試欄而晒,可以看到變量的值,自動欄沒有的可以手動添加表達式蝇狼;把鼠標放到變量上可以看到變量的值,但是只能識別簡單的表達式倡怎;棧幀對于觀察遞歸很有用迅耘;在某些時候還可以抓取“異常”监署。

快捷鍵:vscode: Visual Studio Code 常用快捷鍵颤专。英文文檔中當然有快捷鍵的信息,還有Cheet Sheet可以看钠乏,而且英文文檔會更新栖秕。這個單獨列出來還是給初學者吧。

中文亂碼見第六點晓避。其它錯誤先看底下的“某些可能出現(xiàn)的錯誤”以及看評論區(qū)簇捍。

Code Runner

如果你不需要調(diào)試,可以直接右鍵選run code俏拱,或者點右上角的播放按鈕暑塑。如果在終端里運行,可以輸入數(shù)據(jù)锅必,但是少了顯示時間的功能事格;在“輸出”中則上面兩項相反。

用它還可以在非工作區(qū)內(nèi)編譯運行程序搞隐,但executorMap記得放到全局設置里驹愚。在終端中按ctrl + c可以終止程序運行。

如果按照我的配置劣纲,task和code runner還有一點不同的是working directory逢捺。前者是你打開的文件夾,后者是文件所在的文件夾味廊。當然它們也都可以自己修改蒸甜。

其實Code Runner只是代替你手動輸命令,功能并不強余佛,算是適用場景不同吧柠新。不要以為run code跑個Hello World很簡單,Code Runner就很強辉巡,前面那么多配置都是垃圾了恨憎。

另外,樓下的答主韓駿就是此插件作者,有事統(tǒng)統(tǒng)找他(滑稽)憔恳。

多文件編譯

如果你想進行少量的多文件編譯瓤荔,C語言直接用gcc 源文件1.c 源文件2.c 頭文件1.h這樣就好,C++類似钥组,其余選項百度gcc怎么用输硝。 如果需要多次編譯可以寫一個批處理。

如果你想進行大量的多文件編譯程梦,請學習如何寫makefile或使用cmake点把。

如果你想使用別人的庫,比如ffmpeg屿附,可能需要在命令中指定-I郎逃、-l(小寫的L)、-L挺份。具體閱讀那個庫的文檔褒翰。

這些情況下可以考慮單獨建一個工作區(qū),不要和單文件編譯的共用匀泊;還可能需要需要修改那幾個JSON來配置Intellisense优训。

其實不新建工程(Project)、只是單文件就能調(diào)試探赫,是不利于以后使用和理解大型IDE的型宙。不過初學也不用掌握那么多,不要覺得建工程很麻煩伦吠、不建工程就能編譯很強就是了。

總之這個VSC無關魂拦,用其它IDE或是手動編譯還是會遇到差不多的問題毛仪。自行解決。

保存文件夾

如果你用VSC還做別的事(比如寫前端)芯勘,或者有不止一個工作區(qū)箱靴,可以創(chuàng)建一個快捷方式(右鍵新建),把工作區(qū)路徑作為參數(shù)傳給VSC主程序荷愕,還可以加個圖標衡怀。這操作不難,記得打雙引號就行安疗。1.18有了一個窗口多個工作區(qū)的功能抛杨,“文件”菜單里也有“保存工作區(qū)”這個功能,但是我沒試過荐类。


某些可能出現(xiàn)的錯誤

如果你只寫了個hello world怖现,不加任何斷點,按f5以后黑框框一閃而過是正常現(xiàn)象屈嗤。想讓程序暫停運行可以在末尾加上一個或兩個getchar();潘拨,不明白為什么有時要用兩個?去問你們C語言老師饶号;或用system("pause")铁追,或加斷點

如果你要進行調(diào)試,不要開優(yōu)化茫船。gcc用-Og還可以保留一些調(diào)試信息琅束,但clang用了以后就不能用gdb調(diào)試了。即使如此我還是在某一次寫代碼的時候遇到了無法跳入函數(shù)的問題透硝,而VS可以跳入

重命名文件后狰闪,原來已有的Lint還會在問題欄里;修改了文件后斷點可能會失效濒生。以及還存在一些其他的像這樣的小bug埋泵,一般關掉VSC再開就行

preLaunchTask“Compile”已終止,退出代碼為 1:編譯有error并且你用的是F5運行的就會有這個提示罪治;如果你點仍然調(diào)試丽声,就會調(diào)試上一次編譯成功的文件。其實所有的編譯失敗都會觸發(fā)這個錯誤觉义,出錯的返回值是1難道不是常識雁社?所以僅僅告訴我出現(xiàn)了這個提示根本沒用,因為它的意思就是出錯了晒骇,沒有人能看出原因霉撵。這也是為什么我要強烈建議不要把F5當作編譯來使用,按F5出了問題洪囤,我根本看不出是編譯期有問題還是調(diào)試期有問題徒坡,或是你自己的代碼有問題

終端將被任務重用,按任意鍵關閉:聽過“按任意鍵繼續(xù)”嗎瘤缩?這句話就是這個意思喇完。這句話比上面那個退出代碼為1還要沒用,它根本就不包含任何有效信息剥啤,無論成功還是出錯都會顯示它锦溪。所以不要再問這句話“怎么辦”了,先學學如何提問

無法打開...府怯,找不到文件(file:///build/glibc-OTsEL5/glibc-2.27/...):我在Linux下遇到了這個問題刻诊,下一個glibc放到指定位置就行,wget http://ftp.gnu.org/gnu/glibc/glibc-2.27.tar.xz富腊,剩下的就不要問我了坏逢。或者參見這個:Disable "Unable to open file" during debug · Issue #811 · Microsoft/vscode-cpptools

libmingw32.a(lib64_libmingw32_a-crt0_c.o):crt0_c.c:(.text.startup+0x2e): undefined reference to 'WinMain':這是你自己的代碼有問題,沒寫main函數(shù)是整,或者把main寫成了mian

undefined reference to xxx ... linker command failed:調(diào)用了未聲明的函數(shù)肖揣。可能是函數(shù)名打錯了浮入,或者沒有include頭文件龙优。總之是你自己的代碼有錯誤事秀。

ld: cannot open output file ... permission denied:原程序仍在運行(比如死循環(huán))彤断,無法被覆蓋,任務管理器結束那個進程即可

MinGW下易迹,監(jiān)視(Watch)窗口里用strcmp比較中文宰衙,會導致程序崩潰退出。只比較英文就沒事睹欲;Linux下無此現(xiàn)象

如果還有問題供炼,可以試試改成gcc/g++編譯。比如現(xiàn)在#include <bits/stdc++.h>會報'float.h' file not found窘疮,改成g++后就好了袋哼。我覺得這應該是庫的bug,反正我是不知道怎么解決

4. 其他設置

我的一些其他的設置闸衫,用在全局settings.json里涛贯,根據(jù)自己的情況調(diào)整,不需要全部照著我的寫蔚出。寫完一個以后要打逗號弟翘。

現(xiàn)在的VSC用的是可視化的設置界面,其實原本是手動編輯且出現(xiàn)兩列設置的骄酗。點擊右上角那個花括號就能手動編輯衅胀。

"editor.fontFamily":"等距更紗黑體 SC",//控制編輯器字體

"workbench.colorTheme":"One Dark Pro",//主題

"files.trimTrailingWhitespace":true,//保存時,刪除每一行末尾的空格

"files.insertFinalNewline":true,//保存后文件最末尾加一行空格

"workbench.colorCustomizations":{

"activityBar.foreground":"#39C5BB"http://自定義顏色

},

"git.enabled":false,//如果你不用git酥筝,可以考慮關閉它

"git.ignoreMissingGitWarning":true,//同上

"editor.minimap.enabled":false,//我個人不用minimap,就是右邊那個東西

"editor.dragAndDrop":false,//選中文字后雏门,可以拖動它們調(diào)整位置嘿歌。我是不需要

"files.autoGuessEncoding":false,//啟用后,會在打開文件時嘗試猜測字符集編碼茁影。我關閉的理由見5

"[c]":{//"files.encoding":"gbk"http://這樣的格式可以對指定后綴的文件應用設置宙帝,如果你實在想用gbk,就這樣設置吧募闲。cpp同理步脓。},

"window.zoomLevel":0.2,//整體放大

"workbench.settings.useSplitJSON":true,//恢復手動編輯時的兩列設置

更紗黑體是樓下B神做的字體,特點是標點好看(誤):be5invis/Sarasa-Gothic

Consolas雖然是Windows自帶字體中還算行的,但它只有英文字體靴患;微軟雅黑雖然是非襯線字體仍侥,但它不是等距的,這一點非常不適合編程鸳君,等線也不等距农渊;中易宋體……告辭。不下新的字體或颊,其他兩大系統(tǒng)我不清楚砸紊,Windows下簡直沒有編程可用的字體。Consolas加雅黑嘛囱挑,也還行吧醉顽,不過能用更好的干嘛不用呢。

5. 關于中文和亂碼

VS Code輸出中文會出現(xiàn)亂碼平挑,很多人都遇到過游添。這是因為VS Code內(nèi)部用的是utf-8編碼,cmd/PowerShell是gbk編碼弹惦。直接編譯否淤,會把“你好”輸出成“浣犲ソ”。如果把cmd的活動代碼頁改成65001棠隐,會出現(xiàn)漢字只能顯示一半的問題石抡,而且怎么修改成UTF8還是個問題。Linux就沒有這個問題助泽。

原本的解決方法是使用gcc啰扛,編譯時用-fexec-charset=GBK這個參數(shù),生成的程序就是GBK編碼的嗡贺。但是隐解,clang的execution-charset supports only UTF-8。所以诫睬,生成的程序在cmd/ps以及VS Code的終端(其實也是powershell)中運行煞茫,輸出中文還是會亂碼;但是在VS Code的“輸出”中就是正常的摄凡。如果想解決這個問題续徽,可以百度“寬字符輸出”,或者自己手動在cmd里用gcc加上上面那個參數(shù)編譯一遍(可以寫個批處理)亲澡,或者就直接改成用gcc編譯钦扭,clang來lint算了。

如果是打開已有的以GBK編碼的文件床绪,VS Code默認會以UTF-8編碼打開(除非你設置了猜測編碼)客情,這樣編輯器內(nèi)的中文就會亂碼哩照,不過對于初學C的同學來說购桑,寫的代碼一般只有注釋是中文窑眯。此時要點右下角的GBK获黔,選“通過編碼重新打開”,選UTF-8即可概页。GBKtoUTF8這個擴展籽御,理論上如果VSC檢測出的是GBK編碼的,它就會自動做“以UTF-8格式保存”這個操作惰匙;如果VSC沒有檢測出是GBK編碼技掏,它就什么也不會做。但是貌似它有bug项鬼,會把當前文件復制一遍插入到光標處哑梳,見VS code 很好用,但是有個惡心的bug绘盟,大家謹慎鸠真!大神幫解決一下,所以不推薦使用龄毡。

如果你沒有注意到一個GBK編碼的文件被VSC以UTF-8的編碼打開了吠卷,又進行了保存,按照我的測試沦零,這文件里的中文應該是找不回來了祭隔。這個還是比較危險的。而且如果打開了編碼猜測路操,VSC又猜錯了的話……所以我是關閉編碼自動猜測的疾渴。中文特別少的時候猜錯幾率很大。

這樣做了以后屯仗,在含有中文的路徑下可以編譯搞坝,但是仍然不能調(diào)試,所以還是把代碼放到不含中文的路徑中吧魁袜。如果把代碼文件發(fā)給其他用Windows的人桩撮,最好轉(zhuǎn)成gbk,否則別人用記事本打開有可能會亂碼(不過貌似1709改進了記事本的編碼猜測峰弹,1803的下一個版本連LF都支持了)距境。

6. 找不到頭文件的錯誤


有幾位同學遇到了路徑設置正確,編譯也通過垮卓,但是“問題"面板里出現(xiàn)找不到頭文件的error。我也遇到過师幕。這個error是cpptools報的粟按∥芴玻可能的解決方法是把你需要的頭文件的路徑加到c_cpp_properties.json中,或者你的compilerPath沒有設置正確灭将。如果還是解決不了疼鸟,反正不影響編譯,就當做沒看到算了庙曙。如果你遇到了又解決了可以留言告訴大家空镜。如果是非工作區(qū)選c語言或者c++,出現(xiàn)這個錯誤很正常捌朴,因為不滿足前提:路徑設置正確(沒有c_cpp_properties.json)吴攒。

另一種問題:

如果是這個錯誤,這是因為clang的默認target為msvc砂蔽,需要加--target=x86_64-w64-mingw這個參數(shù)才行洼怔。這個默認target貌似是寫死在源代碼里的,反正我找了一圈是沒找到正常修改辦法左驾,下載clang的源代碼镣隶,自己改掉,再編譯clang本身诡右,也許可以解決安岂。或者裝Windows sdk而不使用mingw帆吻,這樣就符合默認target了域那,參考第九點。當然最簡單的辦法就是用gcc桅锄。

7. 其他

按照這樣配置琉雳,長期編譯代碼下來肯定有一大堆的exe,還可能分散在不同的文件夾里友瘤。你可以考慮修改一下json文件翠肘,把生成文件的目錄指定到一個專門放exe的文件夾里(如果不會,百度gcc使用教程)辫秧∈叮或者資源管理器右上角搜索*.exe,就可以搜出它們盟戏⌒髅茫或者寫個bat刪了。都很簡單柿究。

json是一種數(shù)據(jù)交換格式邮旷,<del>大部分是JavaScript的子集</del>現(xiàn)在強行變成完全子集了,數(shù)據(jù)冗余度小蝇摸。VSC和各個擴展會讀取json中的條目婶肩,來決定某些功能的行為办陷。這么多條目哪里來的呢?這其實和API差不多律歼。擴展開發(fā)者會把允許修改的選項“告訴”VSC民镜,各個擴展的安裝頁面都有寫,VSC又有intellisense险毁,所以其實很容易寫制圈。如果是單純使用json,我覺得就算從來沒有見過畔况,邊看邊猜也能寫個大概鲸鹦。又因為擴展開源,你甚至可以去擴展的github頁面和開發(fā)者聊天问窃。

Windows 10亥鬓,默認輸入法只有一個微軟拼音,按一次shift就能進行中英轉(zhuǎn)換域庇,而為了保持兼容嵌戈,按ctrl加空格也能進行中英轉(zhuǎn)換,而這個快捷鍵正是強制觸發(fā)Intellisense的快捷鍵听皿。所以熟呛,我強烈建議手動添加“英語”語言輸入法,寫非前端代碼時切換到純英文輸入法(win+空格)尉姨。這樣也可以解決某些游戲需要用到shift鍵但是同樣快捷鍵沖突的問題庵朝。

tasks.json中的"problemMatcher":"$gcc"會解析終端中的錯誤提示,因為已經(jīng)有Clang的Lint了又厉,就不需要這個九府;如果用了Clang Command Adapter又打開這個,則會出現(xiàn)雙重錯誤提示覆致。本來1.11就說可以寫$gcc的侄旬,但當時其實并不支持,現(xiàn)在早就能用了煌妈。不過如果要用非預設版本儡羔,就需要自己寫了。

此配置無法使用Bash for Windows或WSL璧诵,因為bash中的反斜杠會被識別為換行汰蜘。cpptools現(xiàn)為launch.json提供了一個Bash on Windows Launch的snippets,但是我沒有試過如何使用之宿。

8. 其他工具鏈的選擇

使用MinGW編譯但仍用Clang提供Lint:tasks.json的命令行自己改一改族操,code runner的命令行在settings.json里,自己改比被。這樣可以在終端中輸出不亂碼坪创,參考第六點炕婶。缺點:編譯用的不是Clang,編譯速度相對慢莱预。Lint可能提示的警告不全,比如Clang給出的"did you mean ..."提示项滑,Lint就可能捕獲不到

MinGW-w64 + 官方擴展:不使用Clang依沮。除了上面做的,tasks.json里problemMatcher打開枪狂;settings.json里的東西自己改一改危喉。缺點:Windows下的Lint效果真的真的很差,Linux稍微好一點州疾。感覺相比上一個方案沒有優(yōu)點辜限?

Windows SDK + 官方擴展:VS Installer選VC++工具集和一個完整的SDK(默認勾上的那個就是)即可。擴展用cpptools严蓖,c_cpp_properties.json可以自動化配置(ctrl+shift+p, edit configurations)薄嫡;另外兩個json也要改,VS的編譯器是cl颗胡,參數(shù)也要改毫深;調(diào)試器也許可以用VS的。不過這樣我覺得也許還不如直接用VS毒姨,而且我沒試過

如果以上都看不懂哑蔫,可以試試這個配置好的(不過人家的配置方法和我的不一樣):【VSCode】Windows下VSCode便攜式c/c++環(huán)境

如果不想用VSC寫了,可以看看這篇問題:毫無編程基礎的小白準備學習C語言弧呐,用VC6還是VS2015闸迷?

codeblocks現(xiàn)在還活著,配置一番(雖然同樣有點折騰)也可用俘枫。Clion界面美觀腥沽,功能應該也挺強,不過只有英文崩哩,剛上手用起來可能有點困難巡球,學生可以免費申請key,否則收費

9. 我編寫代碼的體驗

體積上邓嘹,合并后的llvm文件夾占1.6g酣栈,vsc 0.2g,加上一些擴展汹押。如果只是用來寫C矿筝,體積占用并不算小。內(nèi)存占用棚贾,如果VSC不出bug窖维,還是比較少的(0.5g左右)榆综。

VSC的第一優(yōu)勢也許是好看?雖然不是專門為C/C++設計的铸史,但它真的還有許多其它優(yōu)點鼻疮。光Lint這一點就比wintc、cfree琳轿、dev c++強了很多了判沟,更別提dev c++自己的Debug功能就有bug,還極其容易碰到崭篡。

我還有一點想對學生黨說:能自己百度到這篇文章挪哄,努力去看懂、動手配置琉闪,已經(jīng)比貼吧無數(shù)伸手黨和等著老師在qq群里發(fā)IDE的人強了很多了迹炼。另外如果有能力,我還是建議你們讀讀VSC的文檔:Documentation for Visual Studio Code颠毙,并不復雜斯入,體驗一下英語的實際應用也不錯哦。

附錄

送大家一份21天學通C++第8版 高清完整PDF 這是片段:

大家可以加qun獲取吟秩。

最后編輯于
?著作權歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末咱扣,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子涵防,更是在濱河造成了極大的恐慌闹伪,老刑警劉巖,帶你破解...
    沈念sama閱讀 216,372評論 6 498
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件壮池,死亡現(xiàn)場離奇詭異偏瓤,居然都是意外死亡,警方通過查閱死者的電腦和手機椰憋,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,368評論 3 392
  • 文/潘曉璐 我一進店門厅克,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人橙依,你說我怎么就攤上這事证舟。” “怎么了窗骑?”我有些...
    開封第一講書人閱讀 162,415評論 0 353
  • 文/不壞的土叔 我叫張陵女责,是天一觀的道長。 經(jīng)常有香客問我创译,道長抵知,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,157評論 1 292
  • 正文 為了忘掉前任,我火速辦了婚禮刷喜,結果婚禮上残制,老公的妹妹穿的比我還像新娘。我一直安慰自己掖疮,他們只是感情好初茶,可當我...
    茶點故事閱讀 67,171評論 6 388
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著浊闪,像睡著了一般纺蛆。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上规揪,一...
    開封第一講書人閱讀 51,125評論 1 297
  • 那天,我揣著相機與錄音温峭,去河邊找鬼猛铅。 笑死,一個胖子當著我的面吹牛凤藏,可吹牛的內(nèi)容都是我干的奸忽。 我是一名探鬼主播,決...
    沈念sama閱讀 40,028評論 3 417
  • 文/蒼蘭香墨 我猛地睜開眼揖庄,長吁一口氣:“原來是場噩夢啊……” “哼栗菜!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起蹄梢,我...
    開封第一講書人閱讀 38,887評論 0 274
  • 序言:老撾萬榮一對情侶失蹤疙筹,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后禁炒,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體而咆,經(jīng)...
    沈念sama閱讀 45,310評論 1 310
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,533評論 2 332
  • 正文 我和宋清朗相戀三年幕袱,在試婚紗的時候發(fā)現(xiàn)自己被綠了暴备。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 39,690評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡们豌,死狀恐怖涯捻,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情望迎,我是刑警寧澤障癌,帶...
    沈念sama閱讀 35,411評論 5 343
  • 正文 年R本政府宣布,位于F島的核電站擂煞,受9級特大地震影響混弥,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,004評論 3 325
  • 文/蒙蒙 一蝗拿、第九天 我趴在偏房一處隱蔽的房頂上張望晾捏。 院中可真熱鬧,春花似錦哀托、人聲如沸惦辛。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,659評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽胖齐。三九已至,卻和暖如春嗽冒,著一層夾襖步出監(jiān)牢的瞬間呀伙,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,812評論 1 268
  • 我被黑心中介騙來泰國打工添坊, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留剿另,地道東北人。 一個月前我還...
    沈念sama閱讀 47,693評論 2 368
  • 正文 我出身青樓贬蛙,卻偏偏與公主長得像雨女,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子阳准,可洞房花燭夜當晚...
    茶點故事閱讀 44,577評論 2 353

推薦閱讀更多精彩內(nèi)容