关于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中执行不同语句时,需要用 & 隔开