一、C语言运行环境和编译(1)

1 C语言的开发流程

1 编写源码
	使用的IDE:
		1 如何用VS写源码
		2 用记事本写源码

2 编译源码
	对源码进行编译:
	编译器gcc
		配置环境变量 path添加gcc.exe的路径
			完成后gcc -v 查看是否成功配置
		tips:Windows窗口清屏命令:cls

	编译源代码指令:
		gcc hello.c -o生成的目标可执行文件 xxx.exe 

3 执行可执行文件xxx.exe 
	windows窗口执行xxx

2 C语言的编译步骤

前言:上面处理是一步到位:源文件生成可执行文件
编译实际是经过四步的:
在这里插入图片描述
举个例子:
test.c

#include <stdio.h>
#include "mymath.h"

int main()
{
    int a = 1;
    int b = 2;

    int c = add(a, b);

    printf("%d\n", c);

    return 0;
}

mymath.h

#ifndef MYMATH_H
#define MYMATH_H
int add(int a, int b);
#endif

mymath.c

#include "mymath.h"

int add(int a, int b)
{
	return a+b;
}

2.1 预处理

预处理用于将所有的#include头文件以及宏定义#define替换成其真正的内容,预处理之后得到的仍然是文本文件,但文件体积会大很多。

gcc -E test.c -o test.i   生成预处理文件
上述命令中-E是让编译器在预处理之后就退出,不进行后续编译过程
1 预编译会处理带#的指令如#include <stdio.h>
	头文件展开:预处理时将stdio.h文件拷贝至预处理文件中
2 删除注释
3 宏替换:#define 定义一个宏 如#define PI 3.14,将文件中的所有用宏的地方用表达式替换
4 预处理不会检查语法错误
5 条件编译处理:根据编译键入条件选择代码进行编译
	如:gcc -E test.c -o test.i -Dabc
	此时代码段中
		#if abc
		printf("hello world")
		#endif
	的代码就会放入到预处理文件中,
	如果键入gcc -E test.c -o test.i,预处理文件中就不会有该代码段

在这里插入图片描述

2.2 编译

这里的编译不是指程序从源文件到二进制程序的全部过程,而是指将经过预处理之后的程序转换成特定汇编代码(assembly code)的过程。

gcc -S test.i -o test.s
将预处理文件编译生成汇编文件
检查语法错误

在这里插入图片描述

2.3 汇编

汇编过程将上一步的汇编代码转换成机器码(machine code),这一步产生的文件叫做目标文件,是二进制格式。

gcc -c test.s -o test.o
将汇编文件编译生成二进制文件.o
tips:此时二进制文件执行不了,需要设置链接一些环境等

在这里插入图片描述
二进制文件,记事本打开无法解码查看,所以为乱码

2.4 链接

链接过程将多个目标文以及所需的库文件(.so等)链接成最终的可执行文件(executable file)。默认是动态链接,可通过-static指定为静态链接

gcc mymath.o test.o -o answer

2.5 总结

( test.c mymath.c ) --1–> (test.i mymath.i) --2–> (test.s mymath.s) --3–> (test.o mymath.o) --4–> (answer.exe)

  1. 预处理,展开头文件/宏替换/全掉注释/条件编译
  2. 编译,检查语法,生成汇编
  3. 汇编,汇编代码转换成机器码
  4. 链接,链接到一起生成可执行文件

3 第一个C程序hello.c详解

//# 预处理指令,在预编译时处理
//#include <stdio.h> 包含stdio.h文件  stdio.h类似于菜单
//printf函数依赖于stdio.h文件里的函数声明
// 两个斜杠是注释
//符号与()结和代表这个是一个函数
//main() main函数也叫主函数 整个程序中仅且只有一个main函数,程序从main函数
//开始执行
//int  代表main函数结束之后的返回值类型
//return  结束这个函数,然后返回值,返回值的类型和函数定义时返回值类型一致
//int main()和void main()在C语言中是一样的,但C++只接受int main这种定义方式
//{}里面的是函数体,所有需要执行的代码必须写在{}中
//每一条代码必须以分号;结尾
//printf是一个库函数,printf+()就是函数调用
#include <stdio.h>
int main()
{
        printf("hello world\n");//打印到终端
        return 0;
}

4 system库函数

作用: 在程序中启动另一个程序
参数:要的是待启动程序的路径名

#include <stdio.h>
#include <stdlib.h>
int main()
{
        //syetem启动程序,如果这个程序系统可以找到,不用加路径,
        //如果环境变量找不到,需要加路径
        //windows路径以\\  或 /
        //system("mspaint");//启动画图板
        //system("C:\\Users\\Administrator\\Desktop\\c++13\\hello.exe");
        system("C:/Users/Administrator/Desktop/c++13/hello.exe");
        printf("hello worldfbahfoahfoooooooooooooooooooooo\n");//打印到终端
        return 0;
}

5 CPU概述

cpu运算,寄存器存储运算的数据
CPU计算时,预先将需要的数据从硬盘读到内存,再把数据从内存读到寄存器
因此CPU、寄存器、内存之间存在数据交换
缓存:来提高内存与寄存器之间的交换速度,经常操作内存同一地址的数据,通过缓存提高运行速度
  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值