VS Code调试C代码
1、前言
首先说明的是vscode是代码编辑器,并不是编译器,它本身并不能编译C语言。
在这里我们使用的是MinGW-w64作为C语言的编译器。MinGW-w64的前身是MinGW的全称是:Minimalist GNU on Windows。它实际上是将经典的开源 C语言 编译器 GCC 移植到了 Windows 平台下,并且包含了 Win32API ,因此可以将源代码编译为可在 Windows 中运行的可执行程序。
而且还可以使用一些 Windows 不具备的,Linux平台下的开发工具。一句话来概括:MinGW 就是 GCC 的 Windows 版本 。
我们这里使用的MinGW-w64是MinGW的升级版,MinGW只能编译32位程序,而MinGW-w64可以编译64位和32位程序。MinGW已经停止更新了,所以大家还是要使用MinGW-w64。
MinGW-w64推荐去官网下载:https://sourceforge.net/projects/mingw-w64/files/mingw-w64/

1:下载绿色版,下载速度快
2:下载windows的安装版,一般情况下下载失败
所以演示绿色版的安装过程,绿色版只是需要添加环境变量,将绿色版解压到D盘根目录,如下

按步骤添加环境变量

测试MinGW-w64是否安装完毕

2、编译C代码
下面将用MinGW-w64编译C代码,正如上文所说MinGW-w64就是gcc的windows版,所以直接就是gcc编译C代码。在D盘新建目录C,并在目录C中新建main.c文件,代码如下
#include <stdio.h>
#include <AclAPI.h>
int main(){
char name[100];
printf("What is your name?\n");
scanf("%s",name);
printf("Hello,%s,nice to meet you!\n",name);
}
这就是一个简单C程序。下面使用window的cmd编译并运行这个C程序。

使用windows的powershell编译也是一样的结果

3、vscode编译
上面演示了如何使用MinGW-w64编译C代码,vscode只需要调用这些命令就可以编译C代码,那么vscode的插件就可以优雅的解决这个问题,code runner是一款优秀的编译插件。

因为我们的C代码使用了scanf,需要在终端输入所以需要使能code runner的Run In Terminal功能。

安装了这款插件,在右侧会出现一个运行按钮

点击这个运行按钮,就能编译并运行这个C代码。注意看下图1处,其实就是调用gcc的命令,和我们上面讲的一样。

类似的插件还有C/C++ Compile Run插件。

离开插件就不能编译???vscode当然可以自己调用gcc,自己完成代码的编译,选择运行->以非调试模式运行。这里我们只是编译C代码,然后运行,debug调试的问题,下面再说。

依次选择C++(GDB/LLDB)和C/C++: gcc.exe 生成活动文件

看到终端输出如下(下图我将两个终端并排显示,默认不是这样显示的)

这里可以看到,vscode运行了两个终端,一个编译C语言,一个运行C程序。并且产生了两个文件如下

launch.json作用是在C语言文件启动调试时提供配置参数
tasks.json是一个任务,用于编译C语言的
关于报错,下面制造了一个简单的错误,在终端中给出了出错的位置,这是gcc给出的错误,也就是导致编译不过的错误。

但下图的错误,是vscode认为你有错误,给你提示的,不是所有vscode报的错误gcc都会认为有问题的。并且vscode给出的错误一般与安装的插件有关。我们重点看gcc的错误。

4、多文件编译
上面已经完成了C的编译和运行,但只是一个文件,正常情况下一般会有多个文件。
我们有以下源码来验证多文件编译。
//main.c
#include<stdio.h>
#include "a.h"
int main(void) {
int number;
printf("input:\n");
scanf("%d", &number);
printHello();
if((number > 1) && (number <= 100)) {
printf("Small\n");
} else if((number > 101) && (number <= 200)) {
printf("Middle\n");
} else {
printf("Large\n");
}
return 0;
} //a.c
#include<stdio.h>
#include "a.h" void printHello(void) {
printf("Hello world");
} //a.h
#ifndef __A_H_
#define __A_H_ void printHello(void); #endif
首先使用code runner,运行结果如下

可以看出,code runner只编译main.c,编译报错找不到a.c中的printHello函数。修改code runner的扩展配置Excutor Map,单击前面的小齿轮,选择:将设置复制为JSON文本

然后单击在settings.json中编辑

打开文件如下settings.json

其中的一句代码是我们配置使能runInTerminal的,将我们刚刚复制的粘贴到它的下一行

注意1处需要添加一个逗号,并将2处的$fileName修改为*.c,如下

保存文件,返回main.c,执行code cunner的运行按钮,可以看到执行gcc的编译时,编译所有的c源文件。

看到这里,大家应该就理解了配置文件和执行的gcc命令之间的关系了。
对于上文提到的vscode自己也可以编译的问题,不使用插件如何编译多个文件?上文提到task.json是编译C程序的,它的配置如下

同理将1处的${file}修改为*.c就可以编译多个C文件了。这里就不再演示了。
5、调试
调试是很简单的,在调试之前需要保证编译时没有问题的(虽然这句话像是废话)在其他IDE中你可以直接debug调试,但在VScode中,建议你先编译,首选保证编译过了。因为vsode的编译环境是配置的,可能出现问题,如果编译不通过那就更不能调试了。
编译通过的程序,选中main.c直接选择运行->启动调试。

剩下的就和普通的IDE没有大的差异了

1:自动查看变量
2:手动查看变量
3:调用的堆栈信息
4:可以和其他IDE一样打断点
5:分别是运行,单步,进入函数,跳出函数,复位,停止等常见的调试按钮
6:终端交互界面
点击查看本文所在的专辑:开发工具
VS Code调试C代码的更多相关文章
- 使用visual studio code调试php代码
这回使用visual studio code折腾php代码的调试,又是一顿折腾,无论如何都进不了断点.好在就要放弃使用visual studio code工具的时候,折腾好了,汗~ 这里把步骤记录下来 ...
- windows下用visual studio code 调试go代码
http://www.golangtc.com/download下载安装包或压缩包 配置环境变量 配置GOROOT: 配置PATH:在PATH最后添加 配置GOPATH:GOPATH的作用请自行百度, ...
- .NET Core快速入门教程 5、使用VS Code进行C#代码调试的技巧
一.前言 为什么要调试代码?通过调试可以让我们了解代码运行过程中的代码执行信息,比如变量的值等等.通常调试代码是为了方便我们发现代码中的bug.ken.io觉得熟练代码调试技巧是成为合格程序员的基本要 ...
- 27 Debugging Go Code with GDB 使用GDB调试go代码
Debugging Go Code with GDB 使用GDB调试go代码 Introduction Common Operations Go Extensions Known Issues Tu ...
- .NET Core快速入门教程 4、使用VS Code进行C#代码调试的技巧
一.前言 什么是代码调试? 通过调试可以让我们了解代码运行过程中的代码执行信息,比如变量的值等等.通常调试代码是为了方便我们发现代码中的bug. 本篇开发环境 1.操作系统: Windows 10 X ...
- VS code调试代码快速上手必备知识
一.通过简单的配置运行一个JavaScript程序 1.打开(创建)一个新的工作空间(文件夹),并创建一个js文件: var name='world'; var s='Hello,${name}!'; ...
- 利用chrome调试JavaScript代码
看见网上很多人问怎么用chrome调试JavaScript代码,我也对这个问题抱着疑问,但是没有找到一篇能用的中文文章(可能我的google有问题),也不知道怎么点出一篇E文的,感觉作者写得不错,所以 ...
- 【转】Android 学习笔记——利用JNI技术在Android中调用、调试C++代码
原文网址:http://cherishlc.iteye.com/blog/1756762 在Android中调用C++其实就是在Java中调用C++代码,只是在windows下编译生成DLL,在And ...
- visual studio code 调试nodejs 配置简单HTTP服务器
介绍 Visual Studio Code是一个轻量级的Web集成开发环境on Linux,Mac and Windows,特别是作为前端人员来了, 多了一个可供选择的生产力工具IDE,调试js代码简 ...
随机推荐
- Redis 源码简洁剖析 05 - ziplist 压缩列表
ziplist 是什么 Redis 哪些数据结构使用了 ziplist? ziplist 特点 优点 缺点 ziplist 数据结构 ziplist 节点 pre_entry_length encod ...
- 求Fibonacci数列通项公式
0. Intro \[f_n=\begin{cases} 0 & (n=0) \\ 1 & (n=1) \\ f_{n-1}+f_{n-2} & (n>1) \end{c ...
- simpholders 官方网址 https://www.simpholders.com/
SimPholders可让你快速直接地访问iPhone模拟器应用的app文档.你可以通过SimPholders找到数据库文件.永久存储以及缓存,它是一个非常实用的app debug工具,同时还可以离线 ...
- 使用Java开发桌面即时通讯程序遇到的问题
项目:https://www.lking.top/?p=87 1. JPanel面板绘制背景图片问题. 参考大佬:https://www.jb51.net/article/101516.htm 本项目 ...
- python基础1-类属性和实例属性
类属性就是类对象所拥有的属性,它被所有类对象的实例对象所共有,在内存中只存在一个副本,这个和C++中类的静态成员变量有点类似.对于公有的类属性,在类外可以通过类对象和实例对象访问 类属性 class ...
- 大前端JS篇之搞懂【Set】
我认为前端生态很大,犹如一片汪洋大海,很难短时间内窥其全貌,在这里我们不谈其他,只聊聊 Set Set是 es6 新提出的一个对象,也是一种数据结构,为什么es6要提出这样一个新对象呢,无非就是丰富j ...
- Scala中实现break与continue
Scala是函数式编程语言,因此没有直接的break与continue关键字,要实现break与continue效果,需要绕一下. 需要导入包: import util.control.Breaks. ...
- python基础语法_9-2函数式编程
https://www.imooc.com/learn/317 大纲 1-函数式编程简介 2-高阶函数 3-把函数作为参数 4-map()函数 5-reduce()函数 6-filter()函数 7- ...
- 从服务间的一次调用分析整个springcloud的调用过程(一)
首先我们知道springcloud是一个微服务框架,按照官方文档的说法,springcloud提供了一些开箱即用的功能: 1 分布式/版本化配置 2 服务的注册与发现 3 路由 4 服务到服务之间调用 ...
- 教你写Spring组件
前言 原文地址:https://www.cnblogs.com/qnlcy/p/15905682.html 一.宗旨 在如日中天的 Spring 架构体系下,不管是什么样的组件,不管它采用的接入方式如 ...