Linux下的C语言-小白篇(一)
来源:互联网 发布:java 计算两个时间差 编辑:程序博客网 时间:2024/05/21 07:47
Linux下的C语言-小白篇(一)
C语言对于大家来说并不陌生,编写C语言更是不在话下,如果你说自己写不出多么惊艳的C代码,那起码还是能写出一个“Holle Word”的嘛,今天我将带大家更进一步的了解C语言,从基层了解C语言的整个形成过程,其中包括C的编辑,编译,链接等方面。
在这里如果现在让你来编一个C程序,大家想到的肯定是使用VC++6.0或者是Visual Studio系列等Windons下的IDE软件来编写,那么现在就有人要问了,什么叫做IDE软件呢?
IDE,集成开发环境(Integrated Development Environment)是用于提供程序开发环境的应用程序,一般包括代码编辑器、编译器、调试器和图形用户界面等工具。集成了代码编写功能、分析功能、编译功能、调试功能等一体化的开发软件服务套。所有具备这一特性的软件或者软件套(组)都可以叫集成开发环境。
顾名思义IDE的目的就是要让开发更加快捷方便,通过提供工具和各种性能来帮助开发者组织资源,减少失误,提供捷径。它将编辑,编译,链接集成在一起,很是方便我们来编写C程序,但也因此非常不适合我们用来学习和深入了解C语言,所以今天我们不会使用这些软件来编写。
Windows这个环境不行了,那我们有一个非常适合我们的环境,那就是Linux,因为在Linux下,C代码的编辑,编译,链接等方面是相互独立的,我相信在分析完每一步后便更有助于我们对C语言的理解,在进入今天的主题前,我先来给大家介绍一下Linux:
Linux是一套免费使用和自由传播的类Unix操作系统,是一个基于POSIX和UNIX的多用户、多任务、支持多线程和多CPU的操作系统。它能运行主要的UNIX工具软件、应用程序和网络协议。它支持32位和64位硬件。Linux继承了Unix以网络为核心的设计思想,是一个性能稳定的多用户网络操作系统。严格来讲,Linux这个词本身只表示Linux内核,但实际上人们已经习惯了用Linux来形容整个基于Linux内核,并且使用GNU 工程各种工具和数据库的操作系统。
简单的来说,Linux就是一款开源的可供大家学习的操作系统。不同与Windows操作系统,Linux没有Windows那美观用户界面,操作起来也不如Windows不方便,Windows中我们操作只需要使用鼠标点击即可,但是在Linux下我们想要操作,必须要学会使用命令行代码,无论是查看、打开文件,还是创建、删除文件都是用命令行来实现的,我们先来学习一下Linux的指令:
1.Linux常用命令
这就是Linux输入命令的界面,也成为Linux终端。
- ls //list 列出当前文件夹的所有文件
- cd //change directory 更改(切换)目录
- mkdir //make directory 创建目录(文件夹)
- mv //move移动文件
- rm //remove 删除文件(-f)
- touch //创建文件
- pwd //print work directory打印当前工作目录
这是最基本的几个操作符,我们来以此看一下效果:
ls 指令 - 用来显示目标列表,在Linux中是使用率较高的命令。
cd 指令 - 用来切换工作目录至dirname。 其中dirName表示法可为绝对路径或相对路径。
- mkdir 指令 - mkdir命令用来创建目录。
- rm 指令 - remove 删除文件(-f)
- mv 指令 - move移动文件
- touch 指令 - 创建文件
- pwd 指令 - print work directory打印当前工作目录
2.在linux环境实践
在学习了几个常用的指令后,接下来就要进行实战了,我们将使用vim编写一个程序,然后使用gcc查看【预处理】、【编译】、【汇编】、【链接】各阶段文件的内容。
- 编写文件
vim a.c
2. 整体实现代码
gcc -o a a.c
3. 分步实现—预处理
gcc -E a.c -o a.i
4. 分步实现—编译
gcc -S a.i -o a.s
5. 分布实现—汇编
gcc -c a.c -o a.o
6. 分步实现—链接
gcc -o Mya a.o
上面便是我们Linux下C程序编辑的基本步骤,相信经过这些步骤大家已经对C语言有了更高的理解,不再将C语言的编辑过程看成一步完成的。通过对编辑好的C程序进行预处理,然后对于处理完的文件进行编译,生成目标文件,该目标文件的内容为汇编语言,在然后对目标文件进行汇编,生成二进制文件,到此处计算机已经能够认识我们的程序了,最后便是对目标文件进行连接,生成可执行文件,这便是我们最终需要的文件。每一步都可以完成,并且每一步都可以生成相对应的文件,非常适合我们对C语言进行深入的学洗。
三.预处理标识符
在之前我们进行实践中,有提到过预处理,现在我们将在这里多讲几个有用的预处理标示符
- _ _ LINE _ _ 文件当前的行号
- _ _ FILE _ _ 进行编译的源文件
#include<stdio.h>int main(){ printf("file : %s line : %d \n",__FILE__,__LINE__); retrun 0;}
gcc a.c -o a1
- _ _ DATE _ _ 文件被编译的日期
- _ _ TIME _ _ 文件被编译的时间
#include<stdio.h>int main(){ printf("date : %s time : %s \n",__DATE__,__TIME__); retrun 0;}
gcc -o a2 a.c
- #
- # #
‘#’可以吧一个宏参数变成相对应的字符串。
#include<stdio.h>#define PRINT(FORMAT,VALUE)\printf("the value of " #VALUE " is "FORMAT "\n",value)int main(){ int i=10; PRINT("%d",i+3); return 0;}
gcc -o b1 a.c
“##”可以吧位于它两边的符号合成一个符号,它允许宏定义从分离的文本片段创建标识符。
#include<stdio.h>#define ADD_TO_SUM(num,value)\sum##num == valueint main(){ int sum5 = 0; ADD_TO_SUM(5,10); return 0;}
gcc -E a.c -o a.i
四.宏和函数的区别
用#define使用参数来定义宏,宏的参数用圆括号括起来,可以使一个参数或者多个参数,然后在使用的过程中这些参数将会被替换。
类函数宏只会做字符串替换(宏定义都只会做字符串替换),替换后为3+1*3+1,结果就是7;而一般函数就会把参数带进函数进行计算后返回结果,这里其实就是(3+1)*(3+1)。
在这里我会写2个关于宏的程序,可以一起来看看。
五.写一个宏可以将一个数字的奇数位和偶数位交换。
#include<stdio.h>#include <windows.h>#define EXC(x) printf("%d %d ",(x>>(i-1)) & 0x1, (x >> i) & 0x1)int main(){ int a = 0; int i = 0; printf("请输入一个数 0 ~ 255 之间!\n"); scanf_s("%d", &a); for (i = 7; i >= 0; i -= 2) { EXC(a); } system("pause"); return 0;}
六.使用宏实现两个数中求较大值。
#include<stdio.h>#include <windows.h>#define MAX(x,y)\x > y ? x : yint main(){ int x = 0; int y = 0; printf("请输入两个数:如(x y)\n"); scanf_s("%d %d", &x, &y); printf("%d 和 %d 两个数中较大的是:%d\n", x, y, MAX(x, y)); system("pause"); return 0;}
到这里相信大家对Linux有了一定的了解,并且在Linux下对C语言进行了分解编译,更好的理解C程序的形成过程,并且在后面介绍了C 语言中的预处理标示符,在Linux下更加清晰的看到了预处理阶段到底进行了那些操作,而后编写了两个关于宏定义的程序,希望能够帮助大家更好的理解!!
- Linux下的C语言-小白篇(一)
- Linux下程序设计 (C 语言) 一
- Linux 下C语言学习(一)——C语言的简介
- Linux下通过Pro*C语言访问Oracle(一)
- Linux 环境下C语言编程(一)
- Linux 下C语言 指针学习 一
- linux下C语言多线程(一)线程的创建与取消
- linux下C语言多线程(一)线程的创建与取消
- linux下C语言多线程(一)线程的创建与取消
- [linux+c]C语言题目(一)
- 近来对指针基础、一二维数组的心得和linux下c语言的编程
- Linux在C语言下的时区设置与修改(一)
- linux操作系统下c语言编程入门 -- (一)目录介绍
- linux环境下使用c语言实现shell(一)
- linux 下的C语言编程(总结)(精华)
- Linux下C语言编程的注意事项(转)
- Linux下C语言线程池的实现(1)
- linux下的C语言开发(开篇)
- java源代码风格转变
- 一张图讲解对象锁和关键字synchronized修饰方法(代码块)
- ArcGIS Beta操作仪表板
- 配置mysql读写分离
- php常用的加密函数
- Linux下的C语言-小白篇(一)
- Elasticsearch集群的数据备份
- JAVA JTree的使用
- 输入型参数和输出型参数
- width和height解决全布局不会撑起来
- Java笔记---部署 JavaWeb 项目到云服务器
- Android 动画
- mybatis分页
- [欧拉回路] 「Balkan OI 2016」Acrobat