我之前做上机用的是Visual C++6.0是比较完整的IDE,基本上非常省心,输入代码运行就行了.现在把系统升级WIN10了,没找到能用的Visual C++版本,听说VSCode非常轻量,就入了VSCode的坑,麻烦的是VSCode是个自助餐,基本上都得自己配.
目前我用VSCode自动编译调试C/C++多文件大致需要以下3步(若后边上机有新的配置要求,还会更新),经过下面配置后基本能像Visual C++6.0一样自动编译运行C/C++文件:
第一步:配置C/C++调试环境,我参考的是这篇https://blog.csdn.net/bat67/article/details/76095813,我按照这个设置完可以编译调试单文件.
第二步:让VSCode像Visual C++一样自动编译调试,我用的是VSCode的插件_Code Runner.这个插件直接"F5"进行调试调试,在调试前自动编译,在调试中自动执行不需要输入的部分,遇到输入的部分,等待输入,然后自动执行后面的部分,记得添加调试断点,不然执行完自动关闭.
在上面第一步中我用VSCode编译调试都是自己手动先点击"终端-运行生成任务"(快捷键Ctrl+Shift+B),排除错误成功生成.exe后,再手动"调试-启动调试"(快捷键F5).关于期间的个各种错误自己先读明白或者查明白报错的内容,再去网上查,我的错误一般都是task.json或launch.josn或c_cpp_properties.json文件中编译器g++/gcc或者调试器gdb路径没写对.
第三步:多文件链接自动编译调试配置.分两步,第1步在task.json中添加其他C/C++文件到编译中;第2步声明外部变量或函数,或者创建头文件.在做该步骤时,确保上面第一步已经配置好,可以编译调试单文件.
本文主要讲第三步的配置,其实很简单,以(C语言程序设计)例7.19为例.
下面是我配置后的task.json代码 (其中一些路径和编译器调试器,需要先参照上面"第一步环境配置"配置好):
//task.json
{
"tasks": [
{
"type": "shell",
"label": "gcc.exe build active file",
"command": "C:\\MinGW\\bin\\gcc.exe",
"args": [
"-g", // 生成和调试有关的信息
"${file}", //${file} 当前打开正在编辑的文件名,包括绝对路径,文件名,文件后缀名
"-g",
"${fileDirname}\\c7-19-2.c",
"-o", // 指定输出文件名,不加该参数则默认输出a.exe,Linux下默认a.out
"${fileDirname}\\${fileBasenameNoExtension}.exe"
//${fileDirname} 当前打开的文件所在的绝对路径,不包括文件名
//${fileBasenameNoExtension}当前打开的文件的文件名,不包括路径和后缀名
],
"options": {
"cwd": "C:\\MinGW\\bin"
}
}
],
"version": "2.0.0"
}
增加的配置是下面两行,这两行把文件c7-19-2.c也包括到编译任务中:
"-g", //-g生成和调试有关的信息
"${fileDirname}\\c7-19-2.c", //新文件的绝对路径,即打开的根文件夹直到此文件的路径
//${fileDirname} 当前打开的文件所在的绝对路径,不包括文件名
若你有多个文件可以每个文件增加两行 ' "-g","${fileDirname}\\xxx.c", '(别忘了每一行的逗号),必要把主函数和你引用到的所有函数都包括到task.json编译任务中来,除了当前打开的文件.注意:上面的两行 "-g","${file}", 已经包括当前打开的文件(尽量保证打开的是包含主函数main的文件,不是也行).
该配置方法的缺点(必读):
1.就是你增加一个.cpp/.c文件,这里就得手动增加2行.上面方法只是我成功的一个办法,如果大家有更方便的一行路径就搞定文件内的所有文件的话,欢迎分享.
2.注意上面的两行 "-g","${file}", 这个指的是你当前打开的文件.而新新添的配置文件 "-g","${fileDirname}\\xxx.c"中的"${fileDirname}"是指"你当前打开的文件所在的绝对路径,不包括文件名".
所以你懂的,就是指你当前的编辑的文件必须是该文件中的某一个文件,才能正确编译出正确的文件.当然你也可以不用{file}/{fileDirname}等巴拉巴拉路径变量,然后手动把绝对路径加进去如果你不怕麻烦,即' "-g","打开的跟文件\\中间文件夹...\\xxx.c", '.
以上task.josn配置就结束了,下面贴一下配置task.josn相关的扩展参考内容:
1.如果你想了解更多关于${file}${fileDirname}等task.josn常用的相关路径变量,可以参考这篇"VS code 中的各种变量 ${file},${fileBasename}"https://blog.csdn.net/bailsong/article/details/77527773
2.如果你想自定义变量路径文件名,比如保留文件名的前几位,然后只改变后边的数字,可以参考这篇:"Shell表达式,如${file##*/}"https://blog.csdn.net/yifanSJ/article/details/78354365
3.如果你想了解更多关于关于"-g" " -o"等gcc或g++的编译器变量定义,可以参考这篇:"gcc/g++参数详解"https://www.cnblogs.com/me115/archive/2011/03/02/1969100.html
例7.19我写了两个C文件:c7-19-2.c和c7-19-2.c.放在了c7-19文件夹(
与第一步环境配置的.vscode同级文件)下.
第一种方法:直接声明外部变量或函数,在要引用某个文件的某个函数地方用extern加入要引用的外部变量和函数声明.
//c7-19-1.c
#include
int A;
extern int power(int m); //外部c7-19-2.c的函数声明,方便下面引用
int main()
{
int b=3,m;
printf("Enter a=");
scanf("%d",&A);
printf("Enter power m=");
scanf("%d",&m);
printf("a*b=%d\na**m=%d\n",A*b,power(m));
return 0;
}
//c7-19-2.c
//因为没用到输入输出,所以就没加头文件#include
extern int A; //外部c7-19-1.c的变量A声明,方便下面引用
int power(int m)
{
int i,pow=1;
for(i=1;i<=m;i++)
pow=pow*A;
return pow;
}
第二种方法:增加头文件,其实头文件包括的就是函数的声明,在哪个文件用,加到那个文件的前面,原理就是包括该头文件里的所有声明.记得用双引号"",不要用尖括号<>,只有编译系统内部包括的库采用尖括号<>.
增加c7-19-1.h头文件:
//c7-19-1.h
extern int A; //声明本文件的外部变量A,变量的外部可用声明前面必须加extern
增加c7-19-2.h头文件:
//c7-19-2.h
int power(int m); //包括函数声明,前面可加可不加extern,函数声明默认是有extern的
下面是c7-19-1.c和c7-19-2.c文件:
//c7-19-1.c
//也可加上#include "c7-19-1.h",方便自己调用"调用的地方后面的"函数或变量
#include
#include "c7-19-2.h" //包含c7-19-2.c的头文件,方便下面引用c7-19-2.c的power函数
int A;
int main()
{
int b=3,m;
printf("Enter a=");
scanf("%d",&A);
printf("Enter power m=");
scanf("%d",&m);
printf("a*b=%d\na**m=%d\n",A*b,power(m));
return 0;
}
//c7-19-2.c
//也可加上#include "c7-19-2.h",方便自己调用"调用的地方后面的"函数或变量
#include "c7-19-1.h" //包含c7-19-1.c的头文件,方便下面引用c7-19-1.c的A变量
int power(int m)
{
int i,pow=1;
for(i=1;i<=m;i++)
pow=pow*A;
return pow;
}
经过以上几步就可以编译C/C++多文件了(注意:其中一些路径和编译器调试器,需要先参照上面"第一步环境配置"配置好).
扩展:关于extern和static(还有auto和register等不常用)这些声明前缀,的说明可以阅读"C程序设计"第七章7.9-1.11,或者自己上网查相关内容.