使用Visual Studio 2019 开发C语言版helloworld
Visual Studio 2019下载地址 https://visualstudio.microsoft.com/zh-hans/vs/
1.启动Visual Studio 2019
2.创建新项目
![5584efb7afc54acf03ab3e130fc1d8b5.png](https://img-blog.csdnimg.cn/img_convert/5584efb7afc54acf03ab3e130fc1d8b5.png)
3.设置项目模板
选择基于C++的空项目
![905ae9c68da82e6f14cbb4d2509727b9.png](https://img-blog.csdnimg.cn/img_convert/905ae9c68da82e6f14cbb4d2509727b9.png)
4.设置项目名称、位置以及解决方案名称
项目名称: c-core-foundational
位置:D:workspacecittimelinedotnetvs2019
解决方案名称:c-core
![394490c00e0fc0040f85dfd9b6db3e1d.png](https://img-blog.csdnimg.cn/img_convert/394490c00e0fc0040f85dfd9b6db3e1d.png)
5.项目结构说明
解决方案c-core下可以创建多个项目,例如c-core-foundational,c-core-advanced
源文件用于存放后缀名是.c的源文件
头文件用于存放后缀名是.h的头文件
![96885d1436d0cd03d3e7e1eaa0e022fb.png](https://img-blog.csdnimg.cn/img_convert/96885d1436d0cd03d3e7e1eaa0e022fb.png)
为了存放不同章节的源程序(即C代码),这里创建net/ittimeline/c/core/foundational/的筛选器
![337d198a59ca08c6693e05d71dc864fc.png](https://img-blog.csdnimg.cn/img_convert/337d198a59ca08c6693e05d71dc864fc.png)
![f1c43a5ea24df4845aa04751a9371f9a.png](https://img-blog.csdnimg.cn/img_convert/f1c43a5ea24df4845aa04751a9371f9a.png)
6.创建源文件
![ff2d8f55cdde0e8ff073bea94584ca18.png](https://img-blog.csdnimg.cn/img_convert/ff2d8f55cdde0e8ff073bea94584ca18.png)
选择基于Visual C的C文件,文件后缀名是.c,例如这里的helloworld.c
![132e2a07d59eca8ceccffa9868063a75.png](https://img-blog.csdnimg.cn/img_convert/132e2a07d59eca8ceccffa9868063a75.png)
7.编写hello world
#include int main () {printf("Hello C with Windows10 1903 & Visual Studio 2019 16.8 ");return 0;}
8.编译、运行程序
Visual Studio 2019提供了快捷键Ctrl+F5用于开始执行(不调试)
![6fb27209fd9e3235e532c8b6ab9ebbd3.png](https://img-blog.csdnimg.cn/img_convert/6fb27209fd9e3235e532c8b6ab9ebbd3.png)
当运行程序时Visual Studio 2019 会开启一个终端,然后打印输出Hello C with Windows10 1903 & Visual Studio 2019 16.8 并换行
![3eafbf183be1993458f01eaca553b501.png](https://img-blog.csdnimg.cn/img_convert/3eafbf183be1993458f01eaca553b501.png)
Visual Studio 2019调试C程序
首先编写一段C程序,然后嵌套汇编实现两个整数变量相加
#include /* c语言嵌套汇编语言实现变量的加法运算*/int main(){//定义整型变量i,j,kint i;int j;int k;__asm{mov i, 10//10的值放在i对应内存的位置mov j, 20//20的值放在j对应内存的位置mov eax, i//把i内存的值放在eax寄存器add eax, j//eax和j相加,结果放在eaxmov k, eax//eax的值放在k中}printf("%d", k);//把k的值输出return 0;//成功完成}
之前使用Ctrl+F5是不调试运行程序,如果要调试程序,按快捷键F5即可。
在调试之前,需要在程序的指定位置添加断点,当程序运行到断点的地方时会暂停
![3ebe9ca0a648a0f4b1e00c2bf91e3deb.png](https://img-blog.csdnimg.cn/img_convert/3ebe9ca0a648a0f4b1e00c2bf91e3deb.png)
然后F5启动调试,在局部变量视图中可以查看到程序中的局部变量值的变化过程
![e024bb58f67d6f6203245ccca2c27ab7.png](https://img-blog.csdnimg.cn/img_convert/e024bb58f67d6f6203245ccca2c27ab7.png)
F11逐语句执行,就是程序中的代码一行一行的执行,当F11走完成mov j, 20 时,此时i的值是10,j的值是20
![0b6caf30c40f39c00b79197658233399.png](https://img-blog.csdnimg.cn/img_convert/0b6caf30c40f39c00b79197658233399.png)
赋值完成
当走完mov k ,eax时,eax寄存器的值是30(1E转换成10进制就是30),此时可以通过寄存器视图查看eax的值
![eccc62d7409a5a15ca05fcfc6d227181.png](https://img-blog.csdnimg.cn/img_convert/eccc62d7409a5a15ca05fcfc6d227181.png)
在日常开发中还会关注变量的内存地址,通过监视1窗口增加监视,输入地址符&加上变量的名字就可以获取变量的地址
![1406daf1a77cdeb49fbba8929a3da772.png](https://img-blog.csdnimg.cn/img_convert/1406daf1a77cdeb49fbba8929a3da772.png)
拿到变量的地址以后就可以查看变量在内存中的存储
Visual Studio 2019的内存视图中整数变量的值默认是使用16进制表示的,右边列的选项是代表字节数量,例如4就是使用4字节显示
![a69aae708122a6eb60e8b6997f5d2e62.png](https://img-blog.csdnimg.cn/img_convert/a69aae708122a6eb60e8b6997f5d2e62.png)
在使用Visual Studio 2019调试程序的过程中,除了F11逐语句以外,还有个逐过程F10,为了理解他们二者的区别,这里编写了一个程序,其中自定义了一个debug方法,在main函数中被调用,
并且在debug()函数被调用的地方下了断点,然后F5调试程序,然后分别以F10和F11调试,发现F10不会进入debug()函数内部执行调试,而F11会进入debug()函数内部执行调试。
![90ed8152b0e25c6d985443eeb24d39f5.png](https://img-blog.csdnimg.cn/img_convert/90ed8152b0e25c6d985443eeb24d39f5.png)
#include void debug() {printf("inside debug method");}/*理解Visual Studio 2019的调试快捷键F11和F10的区别*/int main() {printf("跟光磊学C语言");debug();return 0;}
因此后期如果调试程序时,不想进入方法内部,应该按F10,想要进入调用方法内部按F11即可。而Shift+11可以跳出被调用的方法。
使用system函数阻止Visual Studio 2019的终端闪退
在Visual Studio 2019中 点击本地Windows调试器就可以直接编译 、运行程序,
![acec8d976c3dd758ec366920fc7b8b62.png](https://img-blog.csdnimg.cn/img_convert/acec8d976c3dd758ec366920fc7b8b62.png)
x86/x64
其中左边的X86表示32位,X64表示64位,如果C语言嵌套了汇编代码,则不能使用X64来编译、运行C程序。
#include int main () {printf("Hello C with Windows10 1903 & Visual Studio 2019 16.8 ");return 0;}
当使用Visual Studio 2019的Windows调试器调试运行程序时出现了闪退现象,而如果手动启动终端后使用GCC编译运行程序则不会闪退。为啥勒?
因为Visual Studio 2019中的终端是Visual Studio 2019自动启动的终端,因为printf()函数默认是往终端打印输出""字符串的内容,当main函数结束以后Visual Studio 2019会关闭终端,弹出终端和关闭终端的时间非常短,因此发生了闪退现象。
那么如何解决这个问题呢?
方案1:使用死循环。然后手动点击右边的×关闭窗口或者按Ctrl+c强制中断程序。不推荐使用
方案2:getchar(),该函数是从键盘获取一个字符,获取字符后退出程序。也不推荐使用
方案3:pause暂停命令,请按任意键提示...,C语言中使用system(“pause”)函数调用,这样Visual Studio 2019中的C程序终端就不会闪退了。 推荐使用
自己打开的终端只有在输入exit命令才会退出终端。
system(“pause”);语句只有在Visual Studio 中才需要使用,因为它会自动关闭终端,而在其他的集成开发环境Qt,CLion,XCode中则不需要。
Visual Studio 2019中常用快捷键
快捷键功能ctrl+k,f自动格式化选中代码ctrl+k,c注释选中代码ctrl+k,u取消选中注释代码F9设置断点F5调试运行Ctrl+F5不调试运行Ctrl+Shfit+b编译不运行F10next逐过程调试,一个方法一个方法调试,如果代码中有函数调用,不会进入函数内部,但是函数还是会被调用执行F11step逐语句调试,一行一行调试,如果代码中有函数调用,则会进入函数内部一行一行执行Shfit+F11跳出F12查看函数定义Cltr+ -退出函数定义
Visual Studio 2019的C4996错误
C4996是Visual Studio 2019内部错误的一个编号
Visual Studio 2019希望开发者使用Visual Studio提供的非标准C库函数,但是开发者希望使用标准的C库函数,因为标准的C库函数是可以跨平台的。
#include #include #include int main(int argc,char *argv[]){char buffer[32]=""; //strcopy()是标准的库函数 //将hello string 复制到buffer变量中 strcpy(buffer,"hello string"); printf("bufffer = %s",buffer); system("pause"); return 0;}
当运行该程序时就会引发C4996错误,Visual Studio 2019的输出视图中会提示strcopy是不安全的函数,建议使用strcopy_s,或者使用 宏定义解决,宏定义放在#include语句的上面
#define _CRT_SECURE_NO_WARNINGS # 防止C4996错误
除此以外还可以使用#pragma warning(disable:4996)来防止Visual Studio 2019的C4996错误
#pragma warning(disable:4996)
#define _CRT_SECURE_NO_WARNINGS # 防止C4996错误#include #include #include /*解决Visual Studio 2019 的C4996错误@author liuguanglei 18601767221@163.com@wechat 18601767221@website ittimeline.net@version 2020/11/22*/int main(int argc, char* argv[]) {char buffer[32] = "";//strcopy()是标准的库函数//将hello string 复制到buffer变量中strcpy(buffer, "hello string");printf("bufffer = %s", buffer);system("pause");return 0;}
Visual Studio 2019 代码片段
如下代码片段是在Visual Studio 2019中C程序的最小程序结构
#define _CRT_SECURE_NO_WARNINGS#include #include /* @author liuguanglei 18601767221@163.com @wechat 18601767221 @website ittimeline.net @version */int main(int argc, char *argv[]){system("pause");return 0;}
代码片段是在Visual Studio 2019中使用快捷键(这里定义的快捷键是ct)生成指定模板的代码
1.创建代码片段文件 vs_code_c_template.snippet
<?xml version="1.0" encoding="utf-8"?>MyCCodeTemplatectc的标准模板代码Microsoft CorporationExpansionSurroundsWith #include /* @author liuguanglei 18601767221@163.com @wechat 18601767221 @website ittimeline.net @version */int main(int argc, char *argv[]){system("pause");return 0;}]]>
- 选择Visual Studio 菜单栏 工具->代码片段管理器 (快捷键:Ctrl+k,b)打开
语言选择Visual C++
然后选中My Code Snippets,单击导入,然后选择磁盘目录下的vs_code_c_template.snippet文件,然后点击打开,确定即可。 - 在Visual Studio 2019中创建C语言的源文件后输入快捷键ct就可以生成固定的C代码
#define _CRT_SECURE_NO_WARNINGS#include #include /*@author liuguanglei 18601767221@163.com@wechat 18601767221@website ittimeline.net@version*/int main(int argc, char* argv[]){system("pause");return 0;}
![db46d4bc757726f1979cf500e3263ad9.png](https://img-blog.csdnimg.cn/img_convert/db46d4bc757726f1979cf500e3263ad9.png)
![007b8aadf6b8216115ac85d012a8c2ed.png](https://img-blog.csdnimg.cn/img_convert/007b8aadf6b8216115ac85d012a8c2ed.png)