2020/3/22 接着

2020/3/22

C语言

C语言(gcc)编译过程

源文件hello.c

  • 预处理 hello.i(预处理文件)

  • 编译 hello.s(汇编文件)

  • 汇编 hello.o(目标文件)

  • 链接 hello.exe(可执行文件)

预处理

  • 参数:-E

  • 生成的文件: xxx.i预处理文件

  • 使用命令:gcc-E xxx.c -o xxx.i

  • 工具:预处理器(包含在gcc编译集合工具中)

  • 完成的工作:

    • 头文件展开。

      • 展开<stdio.h>文件内容,和源码一起,放到xxx.i文件中。
      • 不检查语法错误,可以在这个阶段展开任意文件。
      • 测试命令:gcc -E hello.c -o hello.i -I(大i)。(当前目录)
    • 宏定义的替换。

      • 将宏名,替换为宏值。
      • 【解释】:#define PI 3.14
        • define 创建宏
        • PI:宏名
        • 3.14:宏值
    • 替换注释。

      • 把单行、多行注释替换成空行
    • 展开条件编译。

      • ifdef 宏名······#endif(如果定义“宏名”,进入条件)

      • 根据条件展开代码

      • #include<stdio.h>
        #define PI 3.14
        int main()
        {
        	//展开条件编译。
        	#ifdef PI
        		printf("5555\n");
        	#endif
         } 
        

编译

  • 参数:-S

  • 生成的文件: xxx.s预处理文件

  • 使用命令:gcc -S xxx.i -o xxx.s

  • 工具:编译器(包含在gcc编译集合工具中)

  • 完成的工作:

    • 逐行检查语法错误!【重点】——编译过程整个gcc编译4步骤最耗时的部分
    • 将C语言程序翻译成汇编指令,生成汇编文件

汇编

  • 参数:-c

  • 生成的文件: xxx.o 目标文件(二进制)

  • 使用命令:gcc -c xxx.s -o xxx.o

  • 工具:汇编器(包含在gcc编译集合工具中)

  • 完成的工作:

    • 翻译:将汇编指令翻译成对应的二进制指令

链接

  • 参数:无(-o不是链接阶段参数,是用来指定文件名)

  • 生成的文件: xxx.exe 可执行文件(二进制)

  • 使用命令:gcc -c xxx.o -o xxx.exe

  • 工具:链接器(包含在gcc编译集合工具中)

  • 完成的工作:

    • 库引入。
    • 合并多目标文件。
    • 合并启动例程。

printf函数的格式化输出

d   以十进制形式输出带符号整数(正数不输出符号)
o   以八进制形式输出无符号整数(不输出前缀0)
x,X 以十六进制形式输出无符号整数(不输出前缀Ox)
u   以十进制形式输出无符号整数
f   以小数形式输出单、双精度实数
e,E 以指数形式输出单、双精度实数
g,G 以%f或%e中较短的输出宽度输出单、双精度实数
c   输出单个字符
s   输出字符串

程序调试

  • 前提:程序,没有语法问题。

    • 检查:程序出现的逻辑错误
  • 核心思想:

    • 让程序一行一行地执行
  • VS添加行号:

    • 工具——选项——文本编辑器——代码语言——行号
  • 程序调试流程:

    • 添加断点:可以添加多个。

      • 鼠标点击行号左侧灰色区域
      • F9快捷键
    • 调试,必须在Debug模式下。Release模式无效。

    • F5启动调试。

    • 断点停止位置还未执行代码

    • 开始调试

      • 逐语句执行。逐语句执行下一行(F11):遇见函数,进入自定义函数内部,逐条跟踪执行。
      • 逐过程执行。逐过程执行下一行(F10):遇见函数,不进入函数内部,逐条跟踪执行。
      • 逐断点执行。代码中有多个断点,直接跳转到下一个断点。——点击“继续”
      • 跳出函数。跳出当前函数。(shift+F10)

变量

变量3要素:

  • 变量名:用来程序中使用
  • 变量类型:开辟内存空间大小
  • 变量值:储存的实际数据

变量定义

  • 定义语法:类型名 变量名 = 变量值(一般定义法)(int m=666)

  • 会开辟内存空间给变量。变量声明不会开辟内存空间。

变量声明

  • 语法:

    • int a; 没有变量值的定义,叫做声明。
    • extern int a;添加 extern 关键字
  • 特性:

    • 变量必须有定义。
    • 编译器,在使用变量之前,必须看到变量定义。如果没有看到,编译器会自动找寻一个变量声明。提升成 定义。
    • 如果变量声明前,添加了extern关键字,无法提升!

常量

  • 不会变化、不能被修改的数据
    • define PI 3.14 ——【宏定义】定义常量

    • const int a = 10 : const关键字:只读变量

标识符

变量和常量的总称

硬性要求

  • 标识符不能是关键字、函数名。
  • 标识符只能由字母、数字、下划线组成。
  • 不能以数字开头。
  • 大小写严格区分。
    • 通常使用大写定义常量。
    • 通常使用小写定义变量。

命名规范

  • 大驼峰法:int HelloWorld;多个单词组成变量名,每个单词首字母大写。
  • 小驼峰法:int helloworld;多个单词组成变量名,每个单词首字母小写。
  • 小写+下划线(C语言专用)

sizeof关键字

  • sizeof不是函数
  • 使用方法:
    • sizeof(变量名) ——返回变量大小,单位整数字节。
    • sizeof(类型名) ——返回数据类型大小,单位整数字节。
    • sizeof(变量名) ——语法C语言支持改写法,不推荐使用。

整型

有符号整型:

整型名 名称 格式匹配符 占用的大小 最小值 最大值
int 整型 %d 4字节 -2147483648 2147483647
short 短整型 %hd 2字节 -65536 65535
long 长整型 %ld Windows:32/64位 :4字节 Linux:32位:4字节 64位:8字节 -2147483648 2147483647
long long 长长整型 %lld 8字节 -9223372036854775808 9223372036854775807

无符号类型:

整型名 名称 格式匹配符 占用的大小 最小值 最大值
unsigned int 无符号整型 %d 4字节 2147483647*2+1
unsigned short 无符号短整型 %hd 2字节 0 65535*2+1
unsigned long 无符号长整型 %ld Windows:32/64位 :4字节 Linux:32位:4字节 64位:8字节 0 2147483647*2+1
unsigned long long 无符号长长整型 %lld 8字节 0 9223372036854775807*2+1

猜你喜欢

转载自www.cnblogs.com/CNLLB/p/12548703.html