關於C/C++路徑不能有中文
昨天下午安裝C++環境的時候出了點問題
查了一下,是路徑有中文,但是我建的文件夾在桌面上,放到D盤的時候運行又沒能調出cmd,只有build。
思來想去決定改賬戶名稱(我賬戶在買電腦裝Win10的時候寫的中文,難免以后還會出現路徑中文問題)。
然后就發現文件夾名字改不了
查了一下,原因就在於你的賬戶正在使用這個文件夾,系統不可能讓正在運行的賬戶文件被改了路徑名稱
於是就需要創建一個新的賬戶,但是我的Win10版本沒辦法常規添加本地賬戶
這里沒有本地用戶與組
win + r + mmc 打開控制台,選擇添加 用戶與組
用戶與賬戶這塊老雞肋了,只能添加微軟賬戶而且跳轉微軟商店又顯示沒這應用
那么,就需要 win + r + netplwiz (全程是Net Person Login Wizard,是管理Windows系統登錄賬戶的)
這樣就能添加一個本地賬戶,然后將其設置為管理員(只有管理員才能有權限修改C盤用戶文件夾名字),之后注銷原先賬戶,用新注冊的賬戶登錄,進行修改。
在這里還需要修改一下注冊表。
我之前沒有修改注冊表導致登回原先賬戶時Windows顯示無法登錄到賬戶,就給我了一個訪客臨時號,看到桌面是初始化的嚇得我還以為文件都沒了,但是在看到C盤與D盤文件都在時才意識到注冊表的問題
Win + r + Regedit
路徑在此,這幾個文件夾中找到有你原先id的那個,修改相應的那個ProfileImagePath,再重新登錄,就一切正常了。
備注
關於注冊表
注冊表是Windows系統存儲關於計算機配置信息的數據庫,包括了系統運行時需要調用的運行方式的設置。
Windows注冊表中包括的項目有:每個用戶的配置文件、計算機上安裝的程序和每個程序可以創建的文檔類型、文件夾和程序圖標的屬性設置、系統中的硬件、正在使用的端口等。
如果注冊表受到了破壞,輕則使windows的啟動過程出現異常,重則可能會導致整個Windows系統的完全癱瘓。
如何正確配置環境網上也有許多從零開始的教程了,這里就說幾點我遇到的問題
關於c_cpp_properties.json
ctrl + shift + p 搜索C/C++,有編輯配置(UI)和(json)區別,如果選的UI會省事很多,直接會有一個c_cpp_properties.json生成
關於“終端將被任務重用,按任意鍵關閉。”
在task.json中補上這一段(我自動生成的task.json中並無這段)
"presentation": {
"echo": true,
"reveal": "always",
"focus": false,
"panel": "shared",
"showReuseMessage": true,
"clear": false
}
重點需要的是其中的 "panel": "shared",
有這個提示的原因是本地端口是被共享的,必須關閉一個進程才能執行另一個
不過我加了之后,運行還是有這句話,不過不影響我運行,那就不管了~(・ω< )★
關於運行完代碼cmd一閃而過
環境配置成功后無論是按F5還是Ctrl + F5均是cmd一閃而過
網上最簡單的解決方法就是,在return 0;
之前加上一句getchar()
,讓cmd等你輸入,這樣達到暫停效果
又或是高級些的,引入#include <stdlib.h>
,代碼中加入system("pause");
。這樣是很好的融入了代碼邏輯,但是很明顯增添了不必要的代碼,多引用了一個與本體代碼執行無關的頭文件
所以我更傾向於在launch.json中額外加入cmd啟動的代碼,這樣省事又好用
但是在我復制完代碼,加入launch.json后,出現了新的問題:
我原本是輸出hello world,但是我在改變輸出內容為hello后,輸出仍然是hello world,相當於壓根沒有編譯
而且 請按任意鍵繼續... 這句話直接接在了代碼輸出后面,顯得極其不美觀
但是我在命令行輸入的時候,卻能夠正常運行
換行的問題只需要在args中加入echo.
就能解決問題。
而且需要注意的是,本身存在的/C
已經起到了暫停作用,不需要再在args中加入pause
,否則你需要敲兩下任意鍵才能關掉cmd
編譯的問題在仔細研究了launch.json各項含義,試圖尋找為什么沒有成功編譯時,找到了原因
"preLaunchTask": "task g++",
這句話我創建launch.json時沒有,我自己補入了,但是這補入的是在gdb啟動的區域內,而我在網上復制的cmd啟動代碼中沒有這句
加上這句話,cmd啟動就能正常工作了
備注
附上我自己的launch.json
{
// 使用 IntelliSense 了解相關屬性。
// 懸停以查看現有屬性的描述。
// 欲了解更多信息,請訪問: https://go.microsoft.com/fwlink/?linkid=830387
"version": "0.2.0",
"configurations": [
{
"name": "(Windows) Launch",
"type": "cppvsdbg",
"request": "launch",
"program": "cmd",
"args": [
"/C",
"${fileDirname}\\${fileBasenameNoExtension}.exe",
"&",
"echo.",
],
"stopAtEntry": false,
"cwd": "${workspaceFolder}",
"environment": [],
"externalConsole":true,
"preLaunchTask": "task g++",
},
{
"name": "(gdb) 啟動",
"type": "cppdbg",
"request": "launch",
"program": "${workspaceFolder}/${fileBasenameNoExtension}.exe",
"args": [],
"stopAtEntry": false,
"cwd": "${workspaceFolder}",
"environment": [],
"externalConsole": true,
"MIMode": "gdb",
"miDebuggerPath": "D:\\mingw64\\bin\\gdb.exe",
"preLaunchTask": "task g++",
"setupCommands": [
{
"description": "為 gdb 啟用整齊打印",
"text": "-enable-pretty-printing",
"ignoreFailures": true
}
],
}
]
}
gcc與g++區別
GCC:GNU Compiler Collection(GUN 編譯器集合),它可以編譯C、C++、JAV、Fortran、Pascal、Object-C、Ada等語言。
gcc是GCC中的GUN C Compiler(C 編譯器)
g++是GCC中的GUN C++ Compiler(C++編譯器)
從本質上而言,gcc和g++並不是編譯器,也不是編譯器的集合,它們是一種驅動器,根據參數中要編譯的文件的類型,調用對應的GUN編譯器
所以,准確的說法是:gcc調用了C compiler,而g++調用了C++ compiler
對於 *.c和*.cpp文件,gcc分別當做c和cpp文件編譯(c和cpp的語法強度是不一樣的)
對於 *.c和*.cpp文件,g++則統一當做cpp文件編譯
使用g++編譯文件時,g++會自動鏈接標准庫STL,而gcc不會自動鏈接STL
gcc在編譯C文件時,可使用的預定義宏是比較少的
gcc在編譯cpp文件時/g++在編譯c文件和cpp文件時(這時候gcc和g++調用的都是cpp文件的編譯器),會加入一些額外的宏
cmd的/?命令
這里用到了的就是/C
在cmd中執行不同語句時,需要用 & 隔開