VSCode配置C/C++环境时相关错误解决方法


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

posted @ 2021-03-05 23:41  Arctic_Maple  阅读(2072)  评论(1编辑  收藏  举报