• C语言核心技术-C语言概述与开发环境搭建


    C语言核心技术-C语言概述与开发环境搭建

    1.1 C语言概述

    1.1.1 C语言发展简史

    • 起源
      1972年,贝尔实验室的Dennis Ritchie和Ken Thompson在开发Unix操作系统时设计了C语言,该操作系统的90%以上的代码都是由C语言实现,后期的Linux,macOS,Android,IOS都是基于Unix发展而来的。
    • 标准
      1987年Dennis Ritchie和Brian Kernighan编写了The C Programming Language第一版是公认的C标准实现,而没有定义C库。
      而后期ANSI/ISO先后于1990年、1999年和2011年发布了C90标准、C99标准和C11标准,该标准定义了C语言和C标准库。

    1.1.2 C语言特性

    C语言作为面向过程的高级程序设计语言,能够轻松的实现自顶向下的规划、结构化编程和模块化设计,这样使得程序结构更加简洁,可扩展性强以及更加容易维护。

    而且C语言有着高效(执行速度快)、功能强大(嵌套汇编)以及可移植性(标准库可移植)、功能强大等优点,而且也存在着对系统平台库依赖严重,由于编程风格自由,经验不足也会容易导致出错,编写代码实现周期长,同样的代码在不同的操作系统(或者编译器)下可能会有不同的表现等缺点。

    1.1.3 C语言应用场景

    C语言偏向硬件驱动、操作系统、底层应用(数据库、编译器)、嵌入式应用开发、游戏引擎等应用场景。

    硬件驱动的绝大部分实现是由C语言和汇编语言实现的。
    主流操作系统(Unix,Linux,macOS,Windows,Android,iOS)的底层实现都是由C语言和部分汇编实现的。
    C++,Java,Python,Swift的编译器或者解释器都是由C语言实现的。
    Git,Nginx,Redis,MySQL,Apache,Linux Kernel都是使用C语言实现的,而且都是开放源代码的,大部分代码可以在GitHub中获取到,可以通过阅读源码提升自己的设计和编码能力。

    1.2 使用Visual Studio Code+gcc 开发C程序

    1.2.1 Visual Studio Code下载与安装

    HelloWorld是学习一门编程语言的入门程序,如果你能独立编写并运行HelloWorld,那么就意味着迈入了编程的大门了。

    Visual Studio Code是微软推出的一款开源、跨平台(Windows,Ubuntu,macOS)的编辑器,这里使用它来编写C语言的源代码,当然除了编写C代码之外,还可以用来编写C++,Java,Python,Go,JavaScript,PHP程序等等。

    为什么首先要使用Visual Studio Code来编写第一个C程序呢,因为Visual Studio Code只是一个编辑器,用于编写源码,并不提供编译或者解释运行程序的功能。
    通过它来对比之前介绍的IDE,体验下使用IDE开发程序带来的好处,也有利于理解IDE背后的相关机制。

    在使用Visual Studio Code之前首先去官网下载
    下载Visual Studio Code

    然后傻瓜一键式安装,安装完成以后启动Visual Studio Code会看到启动界面。
    Visual Studio Code

    关于Visual Studio Code的详细使用可以参考官方提供的文档

    1.2.2 使用Visual Studio编辑源文件

    1.在系统的D盘下创建目录vs_codec用于存放C语言的源程序(即C代码)
    2.在Visual Studio Code中将D:vs_codec目录添加到工作区的文件夹
    添加文件夹到工作区
    选择D:vs_codec文件夹作为Visual Studio开发C程序的工作区
    D:vs_codec
    3.在工作区D:vs_codec目录下创建源文件helloworld.c,C语言的源文件都是以.c结尾的,并编写以下内容

    #include <stdio.h>
    
    int main(int argc, char *argv[]){
        printf("Windows10 1903 & Visual Studio Code  Hello World With C 
    ");
        return 0;
    }

    helloworld.c
    helloworld.c

    1.2.3 gcc安装与配置

    当源文件编辑好完成以后,需要安装和配置gcc,因为Visual Studio Code并没有提供编译C程序的功能。
    如果你之前已经下载安装过Qt,那么恭喜不用额外安装gcc,因为Qt已经集成了编译器。
    只需要将gcc在Qt的bin目录: C:QtQt5.13.0Toolsmingw730_64in 添加至PATH环境变量即可。
    PATH环境变量
    当在终端上执行gcc命令时系统会从该目录寻找gcc对应的可执行程序gcc.exe。
    gcc.exe

    当gcc的PATH环境变量配置成功之后,便可以打开命令提示符(即终端),输入gcc -v便可查看gcc版本信息
    gcc 版本信息

    1. 编译源文件
      在源文件helloworld.c所在的目录地址栏(例如D:vs_codec)输入cmd并回车即可打开终端,此时终端的路径正好是在D:vs_codec,然后使用gcc helloworld.c 编译源文件,Windows上gcc默认会编译生成可执行文件a.exe,Linux下gcc默认会编译生成a.out。
      打开终端并编译helloworld.c

    然后在终端上运行a.exe,程序会将字符串Windows10 1903 & Visual Studio Code Hello World With C输出到终端上。
    编译、运行程序

    如果想要改变编译生成的可执行文件名称,使用gcc时可以使用-o选项实现
    gcc helloworld.c -o helloworld.exe

    1.3 理解gcc编译过程

    刚才在使用gcc编译helloworld时一次性编译链接生成了可执行文件(例如helloworld.exe),而实际上gcc在编译程序时要经历预处理、编译、汇编、链接四个步骤,每个步骤gcc都提供了对应的选项(链接除外),并且每个步骤生成的文件后缀名也是不一样的。

    这里编写源文件gcc_compile_option.c,用于测试gcc的各个编译选项,如果想要查看gcc命令的所有选项,可以使用gcc --help查看所有选项及其说明
    gcc --help

    #include <stdio.h> 
    #define PI 3.141592  //宏定义
    
    int main(int argc, char *argv[]){
        printf("PI = %f 
    ",PI);
        return 0;
    }
    • 预处理
      预处理主要是头文件包含、宏替换以及条件编译,预处理阶段不会做语法检查。
      预处理生成的文件后缀名通常是.i,而对应的gcc选项是-E。

    gcc预处理命令案例

    gcc -E gcc_compile_option.c -o gcc_compile_option.i

    这里预编译会将头文件stdio.h的内容复制到gcc_compile_option.i头文件中,并且将使用#define PI 3.141592的宏进行替换,因此最后运行程序时会看到终端上输出PI =3.141592

    • 编译
      编译是将预处理完成的文件编译成汇编文件。
      编译生成的文件后缀名通常是.s,而对应的gcc选项是-S。

    gcc编译案例

    gcc -S gcc_compile_option.i -o gcc_compile_option.s
    • 汇编
      汇编是将汇编文件生成对应的二进制文件。
      汇编生成的文件后缀名通常是.o,而对应的gcc选项是-c。

    gcc汇编案例

    gcc -c gcc_compile_option.c -o gcc_compile_option.o
    • 链接
      将各个二进制文件加上库函数、启动代码链接生成可执行文件。
      链接没有特定的gcc选项,windows上的可执行文件名为.exe,linux上可执行文件后缀名为.out。

    gcc 链接案例

     gcc gcc_compile_option.o -o gcc_compile_option.exe

    gcc 预处理、编译、汇编、链接、运行
    gcc 预处理、编译、汇编、链接、运行

    1.4 C语言集成开发环境搭建

    目前主流的操作系统(Windows,Linux,macOS)都有完善的C语言集成开发环境,用于编辑、编译、调试、打包部署C程序。

    操作系统 开发工具
    Windows10 1903 Visual Studio 2019
    macOS10.15 XCode10.3
    Ubuntu18.04 QT5.13

    Windows作为世界上最流行的桌面操作系统,当前最新版本为Windows10 1903,VisualStudio作为Windows上最强大的集成开发环境,可以开发Windows软件,游戏,Web应用等等,最新版本为VisualStudio2019 16.2.2。

    Visual Studio 2019启动界面
    Visual Studio 2019启动界面

    Ubuntu作为最受欢迎的桌面版Linux系统之一,推荐采用跨平台的集成开发环境Qt来编写C/C程序。
    QT Creator
    QT Creator
    macOS平台推荐使用XCode来编写C/C
    程序,而且XCode在macOS系统上是自带的,无需额外安装。

    XCode
    XCode
    除此以外还有些跨平台的C/C++ 开发工具,例如来自Jetbrains公司的CLion也可以用来编写C/C++程序。
    CLion
    CLion
    关于IDE的安装以及使用,它们的官网都提供了详细的教程,同学们可以自行去查阅。

    C语言学习过程中会使用Windows10 1903+Visual Studio 2019作为主力开发环境,如果没有特别的说明,默认的环境就是Windows10 1903和Visual Studio 2019。

    1.5 使用Visual Studio 2019开发C程序

    1. 创建新项目
      创建新项目

    2. 选择基于C++的空项目
      选择基于C++的空项目

    3. 配置新项目
      设置项目名称为c-core-foundational,
      项目路径位于d:workspacecvisualstudio2019,
      解决方案名称为c-core。
      Visual Studio 2019中一个解决方案会有多个项目。

    配置新项目
    配置新项目

    项目概览
    项目概览
    4. 创建筛选器
    筛选器用于存放不同阶段的代码,在项目的源文件下创建筛选器net/ittimeline/c/foundational/object
    筛选器

    1. 编写helloworld
      首先选中筛选器net/ittimline/c/foundational/object
      新建项
      然后选择基于C++文件,创建源文件helloworld.c
      helloworld.c

    然后编辑源文件

    #include <stdio.h>
    int main(int argc, char *argv[]) {
        printf("Windows10 1903 & Visual Studio 2019 Hello World With C 
    ");
        return 0;
    }
    1. gcc编译运行helloworld.c
      首先选择项目c-core-foundational,然后鼠标右键选中在文件资源管理器打开。
      在文件资源管理器打开
      此时会打开文件资源管理器,并且路径是D:workspacecvisualstuido2019c-corec-core-foundational
      c-core-foundational
      在文件资源管理器的地址栏输入cmd,然后使用gcc编译、运行程序
      gcc编译、运行程序

    1.6 helloworld详解

    1.6.1 hello world说明

    #include <stdio.h>  
    #include <stdlib.h>
    int main(int argc, char *argv[]) {
        printf("Windows10 1903 & Visual Studio 2019 Hello World With C 
    "); 
        system("pause");
        return 0;
    }

    此段程序是调用了跨平台的输入输出函数实现在控制台输出Windows10 1903 & Visual Studio 2019 Hello World With C 并换行,然后等待用户输入任意键(通常习惯按回车键)后程序退出。
    虽然该程序十分简单,但是是C语言中能够运行的最小程序。后面编写的程序都是在该基础之上扩展的。

    1.6.2 #include <stdio.h>详解

    C语言中以#开头的表示编译时预处理阶段需要处理的。
    因为在main函数中使用了printf函数,但是该函数的声明是在标准输入输出文件stdio.h头文件中。因此需要使用#include <stdio.h>将其包含在源文件helloworld.c中,该文件位于系统目录 C:Program Files (x86)Windows Kits10Include10.0.18362.0ucrtstdio.h
    而该函数的实现在系统库文件中。
    如果想要查看程序依赖了哪些库文件,Ubuntu下可以使用ldd命令查看
    ldd查看程序依赖库文件

    std表示跨平台的,所有以std开头的头文件中声明的函数都是可以跨平台(windows,linux,macOS)使用。

    stdio表示标准输入输出,printf函数就是用于输出,可以将""包含的内容数据输出到控制台,文件甚至是网页。而输入函数有scanf,用于读取键盘的输入,实现程序的交互。该函数后期再介绍详细使用。

    如果想要在Visual Studio中查看系统提供的函数的定义,可以选中函数,然后按快捷键F12便可查看,而返回可以使用Ctrl+-实现。

    为了深入理解#include的作用,这里编写一段程序。
    首先在c-core-foundational的头文件创建和源文件一样目录的筛选器netittimelineccorefoundationalobject
    筛选器

    然后定义头文件include.h
    include.h

    然后将之前编写的源文件helloworld.c的内容复制到include.h头文件中
    include.h

    并在源文件的netittimelineccorefoundationalobject目录下创建源文件include.c,该源文件中只需要使用#include <include.h>包含之前编写的头文件即可。

    然后运行程序,如果发现如下错误

    1>include.obj : error LNK2005: _main 已经在 helloworld.obj 中定义

    是因为在Visual Studio 中,解决方案的一个项目只能有一个main函数,如果包含了多个源文件,把其他源文件的main函数重命名成其他函数即可。
    helloworld_main

    然后再次运行程序,程序结果和之前的helloworld运行结果是一样的。

    1.6.3 main函数

    main函数是c/c++/java程序的入口函数,有且只能有一个,当程序执行时系统会自动调用唯一的main函数,程序从main函数开始执行。如果程序中编写了其他的函数,其他的函数应该被main函数调用才会得到执行。

    例如定义一个返回两个整数相加的函数add,然后想要执行该函数,则必须在main函数调用。

    #include <stdio.h>
    #include <stdlib.h>
    //自定义函数,返回两个整数相加的结果
    
    int add(int left,int right) {
    
        return left + right;
    }
    
    
    int main(int argc, char* argv[])
    {
        int left = 10;
        int right = 20;
        //调用add函数,并定义变量保存结果
        int result =add(left,right);
        printf("%d + %d = %d",left,right,result);
        system("pause");
        return 0;
    }

    main函数左边的的int表示函数的返回类型为整数
    main函数右边的()表示函数的参数,通过传递参数,将外部数据传入函数内部处理。
    {}表示函数的函数体,函数具体做什么事情,都写在{}内,{}是成对出现的。

    main函数中的 printf("Windows10 1903 & Visual Studio 2019 Hello World With C ");表示将Windows10 1903 & Visual Studio 2019 Hello World With C输出到控制台, 表示换行。而;表示语句结束,C语言中的每条语句都要使用;表示结束,否则程序会编译错误。

    return 0 表示返回给系统0,并结束main函数,0表示main函数正常退出。
    return之后的代码都不会执行。

    #include <stdio.h>
    #include <stdlib.h>
    
    int main(int argc, char* argv[])
    {
        printf("Windows10 1903 & Visual Studio 2019 Hello World With C 
    ");
    
        system("pause");
        return 0;
        printf("Windows10 1903 & Visual Studio 2019 Hello World With C again 
    ");
    
    }

    运行上面的程序,Windows10 1903 & Visual Studio 2019 Hello World With C again不会得到输出。

    1.7 注释

    注释是用于描述程序的功能,为了便于程序后期的维护,在开发过程中应该添加适量的注释,编译器在预编译时会删除注释,所以注释的内容不会影响程序的结果。

    C语言中支持的注释包含单行注释(//)和多行注释(/**/)两种,单行注释顾名思义就是注释一行,多行注释可以注释多行,需要注意的是多行注释不能够嵌套使用,否则会发生编译错误。

    增加单行注释和多行注释后的helloworld程序

    #include <stdio.h> 
    #include <stdlib.h>
    
    /*
        main函数左边的int是函数的返回值,右边()的内容表示函数的参数,外部数据通过函数的参数传递到函数的内部处理。
        {}表示函数的函数体,也就是函数执行的所有内容都包含在{}中,它是成对出现的。
        @author liuguanglei ittimelinedotnet@gmail.com
        @website ittimeline.net
        @version 2019/10/17
    */
    int main(int argc, char* argv[]) {
        //	printf函数是系统自带的函数,用于将""包含的字符串按照指定的格式输出到终端,终端可以是控制台、网页或者是文件,目前是输出到控制台。
    
        printf("Windows10 1903 & Visual Studio 2019 Hello World With C 
    ");
        //等待输入任意内容退出程序
        system("pause");
        return 0;
    }
    
    
    

    1.8 Windows命令

    1.8.1 Windows命令概述

    主流的操作系统(Windows,Linux(Ubuntu),MacOS)及大多数应用程序都提供了基于命令行和图形化界面两种交互方式,而移动端是采用手势触控、语音等进行交互。作为普通用户来讲,图形化界面容易上手,而且交互效果更加直观。

    但是作为一个程序员来讲,应该去熟悉各个操作系统的命令行的使用,因为命令行相对图形化界面而言,绝大多数场景下使用更加高效。而且图形化界面本质是对命令行的封装,能用图形化界面实现的基本都可以采用命令行实现。而且在服务器端(CentOS,RedHat)基本上是不会安装图形界面。

    Windows下想要使用命令,必须首先启动控制台。

    Windows系统可以使用快捷键Windows+r调出运行
    win+r

    后输入cmd,便可以进入Windows下的命令行终端
    cmd

    1.8.2 日常开发中Windows常用命令

    在启动Windows的终端(也称为控制台)之后,便可以运行命令了。如果你使用Windows作为开发平台,如下的命令你也许会经常使用到。

    命令名称 功能描述
    dir 列出当前目录列表
    cd 切换目录(只能在根盘符(例如C盘)内切换),cd /切换到磁盘的根目录
    md 创建目录
    rd 删除空目录
    del 删除文件
    type 显示文本文件内容
    echo 输出文本内容 例如echo %path% 查看系统环境变量
    ping 检测网络,例如ping baidu.com
    notepad 记事本
    calc 计算器
    mspaint 画图
    explore 文件资源管理器
    cleanmgr 磁盘清理
    desk.cpl 分辨率设置
    powercfg.cpl 电源设置
    regedit 注册表编辑器
    msconfig 系统配置
    mstsc 远程连接
    firewall.cpl 防火墙
    appwiz.cpl 添加或修改程序
    tasklist 查看进程列表
    taskkill /f /im process-name.exe 关闭指定进程
    netstat -ano|findstr "port" 查看端口占用
    msinfo 系统信息
    sticky notes 便签
    ipconfig 查看ip
    winver 查看windows版本
    cls 清除屏幕内容
    exit 退出终端

    在终端上使用命令时还有些快捷键,例如Tab可以补全路径,上下键可以切换之前输入的命令。*实现模糊匹配操作,例如 del *.txt就可以删除 指定目录的所有文本文件。

    如果想要获取更多的windows命令信息,可以在终端上输入help回车后会显示每个命令的名称以及功能说明。

    1.9 system函数的使用

    system函数用于C程序中调用各大操作系统的命令和应用程序,被调用的命令和应用程序以字符串的方式作为system函数的参数传入,实现读取用户输入的命令,并执行该命令。
    在windows上运行该程序时可以传入notepad,calc等等实现程序调用。
    而Linux和macOS上也有自己的命令可以提供给system函数来调用。

    这里编写一个交互式程序:通过借助C语言的scanf函数读取用户在终端的命令,然后调用system函数来执行对应的命令。

    如果你的开发环境不是Windows10 1903和Visual Studio 2019,可以删除#define _CRT_SECURE_NO_WARNINGS

    #define _CRT_SECURE_NO_WARNINGS
    #include <stdio.h>
    #include <stdlib.h>
    /*
        使用system函数调用各大操作系统的命令		
        @author liuguanglei ittimelinedotnet@gmail.com
        @website ittimeline.net
        @version 2019/10/17
    */
    int main(int argc, char* argv[])
    {
        // 提示用户输入执行的命令
        printf("请输入需要执行的命令
    ");
        //定义字符串保存用户输入命令
        char command[100] = {0};
        //读取用户从键盘输入的命令字符串,并保存到command中
        scanf("%s",command);
        //执行命令
        system(command);
        system("pause");
        return 0;
    }

    因为system函数位于stdlib.h头文件中,意味着它是一个可以跨平台使用的函数。
    例如在Ubuntu下使用gedit命令调用文本编辑器
    ubuntu 使用system函数调用命令

    但是各大操作系统的命令和应用程序是不相同的,例如在Windows上使用system函数传递字符串参数"notepad"时可以打开记事本,而移植到了类Unix上则无法调用记事本。

    1.10 system函数阻止vs闪退

    在Visual Studio 2019中运行程序可以通过快捷键F5直接运行,也可以通过点击本地Windows调试器运行。
    本地Windows调试器

    但是发现在运行helloworld后程序有闪退现象,即程序运行时打开了终端后立即退出,其原因是程序运行是printf函数默认输出数据到终端,因此Visual Studio 2019开启了终端,printf输出数据完成以后,程序遇到return语句并退出,因此终端也会随之退出,因为弹出终端和退终端的时间非常短,所有感觉有闪退现象。

    为了解决这一问题,首先需要在源文件使用#include <stdlib.h>包含标准库头文件,然后在main函数的最后一行加上system("pause"),这样程序运行时不会立即退出,而是等到用户输入任意键(一般习惯按回车键)才会退出。

    解决 helloworld在Visual Studio 2019运行的闪退问题

    #include <stdio.h>
    #include <stdlib.h>
    int main(int argc, char *argv[]) {
        printf("Windows10 1903 & Visual Studio 2019 Hello World With C 
    ");
        system("pause");
        return 0;
    }

    再次运行程序时,在程序的末尾会输出一句请按任意键继续...
    请按任意键继续

    1.11 Visual Studio 2019常用快捷键

    在日常使用Visual Studio 开发中会使用到如下常用的快捷键

    快捷键名称 功能
    Ctrl+k,f 自动格式化代码
    Ctrl+k,c 注释代码
    Ctrl+k,u 取消注释代码
    Ctrl+F5 不调试运行
    Ctrl+shift+b 编译,不运行
    F12 查看函数定义
    ctrl+- 退出函数定义
    F5 调试运行
    F11 逐语句(遇到函数跳到函数内部逐语句执行)
    F10 逐过程 (不会进入函数内部,但是函数会被调用)
    Shift+F11 跳出

    1.12 Visual Studio 2019 调试程序

    在后期编写程序时,经验不足的开发人员通常会遇到两种错误:编译错误和运行时错误,编译错误通常是编写的程序不满足编译器的语法规范,而运行时错误则是程序运行时发生的错误,想要排查程序运行时的错误,就需要使用IDE提供的调试功能。

    在源文件debug.c中定义一个返回两个整数相乘的方法mul,然后在main函数中定义两个变量作为参数传入mul方法中,并调用两个整数相乘的方法,输出计算结果

    
    
    #include <stdlib.h>
    /*
        定义两个整数相乘并返回
    */
    int mul(int source, int target) {
        //打印输出传入mul方法的两个整数参数的值
        printf("source = %d
    ",source);
        printf("target = %d
    ", target);
        return source * target;
    }
    
    /*
    
        Visual Studio 2019的调试
        @author liuguanglei ittimelinedotnet@gmail.com
        @website ittimeline.net
        @version 2019/10/17
    */
    int main(int argc, char* argv[])
    {
        //定义两个变量
        int source = 12;
        int target = 12;
        
    
        //调用两个整数相乘的方法,并将计算的结果保存到整数变量result中
        int result = mul(source, target);
        printf("result = %d 
    ",result);
        system("pause");
        return 0;
    }

    在调试程序前首先需要下断点,可以使用快捷键F9下断点或者取消断点

    下断点
    下断点

    然后使用F5调试运行程序,程序会在之前下过断点的地方暂停(无论是逐语句还是逐过程),此时可以在Visual Studio提供的自动窗口中观察变量的值
    自动窗口

    如果想要一行一行调试代码,可以使用快捷键F11,当遇到函数时(例如这里的mul函数),会进入函数的内部一行一行执行,直到该函数结束为止。

    如果调试时不想进入函数的内部,可以使用快捷键F10,当程序中调用了其他函数时不会进入其他函数内部,但是函数会被调用。

    如果调试时想要从一个断点跳到另外一个断点,可以使用shift+F11实现。

    1.13 Visual Studio 2019的C4996错误

    C4996是Visual Studio 2019提供的错误编号

    首先明确下C4996错误出现错误的原因:
    Visual Studio 希望用户使用Visual Studio提供的非标准库函数,但是程序员希望使用标准库函数,因为标准库是可以移植的。

    如果在Visual Studio中使用标准的库函数,就会引发C4996错误类似于这种提示:error C4996: 'strcpy': This function or variable may be unsafe. Consider using strcpy_s instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.这里的strcpy是标准的库函数,而在Visual Studio中使用这个函数引发了C4996错误。

    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    /*
    
        解决visual studio 2019 的C4996错误
        @author liuguanglei ittimelinedotnet@gmail.com
        @website ittimeline.net
        @version
    */
    int main(int argc, char* argv[])
    {
        //定义一个字符串
        char str[32] = "";
        //将hi string 复制到str中
        strcpy(str, "hi string");
        printf("str = %s 
    ",str);
    
        system("pause");
        return 0;
    }

    那么如何解决问题呢?

    方案1:在源文件的第一行定义宏#define _CRT_SECURE_NO_WARNINGS

    方案2:在源文件的第一行定义#pragma warning(disable:4996)

    解决Visual Studio 2019的C4996错误的两种方式

    #define _CRT_SECURE_NO_WARNINGS
    #pragma warning(disable:4996)
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    /*
    
        解决visual studio 2019 的C4996错误
        error C4996:  'strcpy': This function or variable may be unsafe. Consider using strcpy_s instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.
    
        @author liuguanglei ittimelinedotnet@gmail.com
        @website ittimeline.net
        @version
    */
    int main(int argc, char* argv[])
    {
        //定义一个字符串
        char str[32] = "";
        //将hi string 复制到str中
        strcpy(str, "hi string");
        printf("str = %s 
    ",str);
    
        system("pause");
        return 0;
    }

    1.14 Visual Studio 2019的代码片段

    Visual Studio 2019提供了代码片段的功能,其作用就是配置代码片段后,可以通过输入指定的快捷键生成模板代码,这样可以大大提高开发效率。

    在后期编写C程序中,需要反复使用到如下的代码片段

    #define _CRT_SECURE_NO_WARNINGS  
    #include <stdio.h>
    #include <stdlib.h>
    /*
    
        @author liuguanglei ittimelinedotnet@gmail.com
        @website ittimeline.net
        @version
    */
    int main(int argc, char* argv[]) {
    
        return 0;
    }

    首先自定义代码片段文件MyCCode.snippet

    <?xml version="1.0" encoding="utf-8"?>
    <CodeSnippets xmlns="http://schemas.microsoft.com/VisualStudio/2005/CodeSnippet">
        <CodeSnippet Format="1.0.0">
            <Header>
                <Title>MyCCodeTemplate</Title>
                <Shortcut>mcct</Shortcut>
                <Description>c的标准模板代码</Description>
                <Author>Microsoft Corporation</Author>
                <SnippetTypes>
                    <SnippetType>Expansion</SnippetType>
                    <SnippetType>SurroundsWith</SnippetType>
                </SnippetTypes>
            </Header>
            <Snippet>
                <Code Language="cpp">
                <![CDATA[#define _CRT_SECURE_NO_WARNINGS
                #include <stdio.h>
                #include <stdlib.h>
          /*
            
              @author liuguanglei ittimelinedotnet@gmail.com
              @website ittimeline.net
              @version
          */
                int main(int argc, char *argv[])
                {
                    system("pause");
                    return 0;
                }]]>
                </Code>
            </Snippet>
        </CodeSnippet>
    </CodeSnippets>

    然后选择Visual Studio 2019 菜单 工具->代码片段管理器

    代码片段管理器
    代码片段管理器

    选择代码片段管理器的语言为C++,然后选中My Code Snippets
    导入MyCCode.snippet
    然后为导入的代码片段选择一个位置
    为导入的代码片段选择一个位置

    导入成功
    导入成功

    导入成功之后新建任意的C程序源文件,在源文件中输入快捷键mcct就可以生成如下的代码片段

    #define _CRT_SECURE_NO_WARNINGS
    #include <stdio.h>
    #include <stdlib.h>
    /*
    
        @author liuguanglei ittimelinedotnet@gmail.com
        @website ittimeline.net
        @version
    */
    int main(int argc, char* argv[])
    {
        system("pause");
        return 0;
    }

    想要了解代码片段的更多内容,请移步官网

  • 相关阅读:
    为php5.6.30安装redis扩展
    Laravel利用pusher推送消息
    php闭包使用例子
    利用反射给类中方法加钩子
    mysql删除重复记录
    DB门面,查询构建器,Eloquent ORM三者的CURD
    Laravel5.1之表单验证
    服务提供者及门面
    批量搜索并替换内容
    Laravel之Elixir
  • 原文地址:https://www.cnblogs.com/ittimeline/p/11750624.html
Copyright © 2020-2023  润新知