• C语言学习之路(工具篇)—— Visual Studio的使用


    说明:该篇博客是博主一字一码编写的,实属不易,请尊重原创,谢谢大家!

    第一个C语言程序

    Visual Studio新建项目

    在这里插入图片描述
    在这里插入图片描述

    源文件—添加—新建项

    在这里插入图片描述
    在这里插入图片描述

    通过Visual Studio运行

    在这里插入图片描述

    通过gcc编译后运行

    在这里插入图片描述

    在这里插入图片描述

    C语言编译过程

    C语言编译步骤

    1)预处理

    宏定义展开、头文件展开、条件编译等,同时将代码中的注释删除,这里并不会检查语法

    2)编译

    检查语法,将预处理后文件编译生成汇编文件

    3)汇编

    将汇编文件生成目标文件(二进制文件.o)

    4)链接

    设置运行环境,堆栈等,链接其他库;C语言写的程序是需要依赖各种库的,所以编译之后还需要把库链接到最终的可执行程序中去
    在这里插入图片描述

    gcc编译步骤

    1) 分步编译
    预处理:gcc -E hello.c -o hello.i
    编  译:gcc -S hello.i -o hello.s
    汇  编:gcc -c hello.s -o hello.o
    链  接:gcc hello.o -o hello
    
    • 1
    • 2
    • 3
    • 4
    选项含义
    -o file指定生成的输出文件名为file
    -E只进行预处理
    -S(大写)只进行预处理和编译
    -c(小写)只进行预处理、编译和汇编
    文件后缀含义
    .cC 语言文件
    .i预处理后的 C 语言文件
    .s编译后的汇编文件
    .o编译后的目标文件
    预处理分析

    带#的语句就是预处理指令,预处理指令在预处理的时候处理了
    头文件展开: #include 包含文件stdio.h(预处理时将stdio.h 文件拷贝至预处理文件中)

    在这里插入图片描述

    删除注释: 注释有两种方法: // /* */
    宏替换: #define 代表是声明一个宏, 在预处理时会将宏给替代
    预处理时 不会检查语法错误

    在这里插入图片描述

    条件编译: 条件不成立: #if 0 -> #endif 条件成立 #if 1 -> #endif

    在这里插入图片描述

    编译分析

    将预处理文件编译生成汇编文件

    在这里插入图片描述

    会检查语法错误

    在这里插入图片描述

    汇编分析

    将汇编文件编译生成二进制文件.o

    在这里插入图片描述

    链接分析

    设置运行环境,堆栈等,链接其他库
    在这里插入图片描述

    在这里插入图片描述

    2) 一步编译
    gcc hello.c -o hello(还是经过:预处理、编译、汇编、链接的过程):
    
    • 1

    在这里插入图片描述

    C语言代码分析

    1) include头文件包含

    • #include的意思是头文件包含,#include 代表包含stdio.h这个头文件
    • 使用C语言库函数需要提前包含库函数对应的头文件,如这里使用了printf()函数,需要包含stdio.h头文件
    • 可以通过man 3 printf查看printf所需的头文件

    2) main函数

    • 一个完整的C语言程序,是由一个、且只能有一个main()函数(又称主函数,必须有)和若干个其他函数结合而成(可选)。
    • main函数是C语言程序的入口,程序是从main函数开始执行。

    3) {} 括号,程序体和代码块

    • {}叫代码块,一个代码块内部可以有一条或者多条语句
    • C语言每句可执行代码都是";"分号结尾
    • 所有的#开头的行,都代表预编译指令,预编译指令行结尾是没有分号的
    • 所有的可执行语句必须是在代码块里面

    4) 注释

    • //叫行注释,注释的内容编译器是忽略的,注释主要的作用是在代码中加一些说明和解释,这样有利于代码的阅读
    • /**/叫块注释
    • 块注释是C语言标准的注释方法
    • 行注释是从C++语言借鉴过来的

    5) printf函数

    • printf是C语言库函数,功能是向标准输出设备输出一个字符串
    • printf(“hello world\n”);//\n的意思是回车换行

    6) return语句

    • return代表函数执行完毕,返回return代表函数的终止
    • 如果main定义的时候前面是int,那么return后面就需要写一个整数;如果main定义的时候前面是void,那么return后面什么也不需要写
    • 在main函数中return 0代表程序执行成功,return -1代表程序执行失败
    • int main()和void main()在C语言中是一样的,但C++只接受int main这种定义方式

    system库函数

    作用: 在程序中启动另一个程序
    参数:要的是待启动程序的路径名
    在这里插入图片描述

    寄存器、缓存、cpu、内存之间的关系

    cpu > 寄存器 > 缓存 > 内存
    在这里插入图片描述

    汇编语言

    VS中C语言嵌套汇编代码

    在这里插入图片描述

    VS反汇编

    将重新定义main方法中的代码块,取消汇编代码
    在这里插入图片描述

    1)设置断点F9

    在这里插入图片描述

    2)F5调试

    在这里插入图片描述

    3)选择反汇编按钮

    在这里插入图片描述

    4)根据汇编代码分析程序

    在这里插入图片描述

    VS查看变量内存地址

    打开调试下的内存窗口

    在这里插入图片描述
    打开调试下的监视窗口

    在这里插入图片描述
    查看a变量的内存地址,在监视窗口输入&a回车,然后在内存中搜索即可

    在这里插入图片描述

    VS关闭警告

    在这里插入图片描述

    //解决方法
    #define _CRT_SECURE_NO_WARNINGS     //这个宏定义最好要放到.c文件的第一行
    #pragma warning(disable:4996)	//或者使用这个
    
    • 1
    • 2
    • 3
  • 相关阅读:
    mybatis批量插数据
    【强化学习论文合集 | 2019年合集】一. ICML-2019 强化学习论文
    MyBatis Generator使用总结
    NFS文件共享系统(K8S)
    element-ui踩坑之表格选中toggleRowSelection问题
    张正友标定法过程推导笔记
    MySQL高级篇——数据目录
    Linux安装Nginx的2种方式(Centos7版本)
    win-redis使用技巧--和问题解决
    聊聊wireshark的进阶使用功能
  • 原文地址:https://blog.csdn.net/qq_41782425/article/details/127474717