编程语言应用

首页 » 常识 » 预防 » 编程我是认真的之gcc编译过程
TUhjnbcbe - 2023/10/18 18:10:00
北京专业治疗白癜风医院是哪家 https://wapyyk.39.net/bj/zhuanke/89ac7.html
Posix说明1.不同操作系统,执行代码的结果可能不同2.Posix是一种编程标准,编写代码时,尽可能使用符合标准的函数,这样代码可以在各个平台都兼容。C语言编译过程以gcc为例进行示范,如果在windows平台的朋友,请先安装WinGW。详细的安装教程,请看另一篇文章编写源代码文件,main.c#includeintmain(intargc,char*argv[]){printf(欢迎来到早知之!);return0;}01预处理实质上就是将#部分展开拷贝到.c中,形成预处到最后的文件.igcc-Etest.c-otest.i02汇编将高级语言翻译成汇编语言的过程,形成.s文件gcc-Stest.i-otest.s03编译将汇编语言翻译成二进制文件.o,机器直接使用gcc-ctest.s-otest.o04链接将二进制文件与库文件(dll,so)建立联系,形成exe文件gcc-otesttest.o记忆技巧宽衣(-E)解带(-S)上小床(-c)最后o几下。如果想直接把源文件变成exe文件可以使用下面命令gcctest.c-otest预处理详解预处理包括:宏定义、头文件和条件编译01宏定义不带参数的宏定义格式:#define宏名字符串作用:用宏名替换字符串#include#include#include#defineHIhelloworld!\nintmain(){printf(HI);//HI替换了helloworld!\nreturn0;}-----------------#define主函数main#define整型int#define打印printf#define返回值return/*通过宏定义把C语言改成易语言*/整型主函数(){打印(helloworld!\n);返回值0;}带参数的宏定义格式:#define宏名(参数列表)表达式作用:通过宏名中的参数传入表达式中,并将表达式产生的结果返回。#defineSORT(a,b)((a)(b))?(a):(b)intmain(){inta=0;a=SORT(2,3);printf(%d\n,a);//返回3return0;}代码执行的过程:1.a=SORT(2,3)替换成a=SORT(a,b)2.a=SORT(a,b)替换成a=(ab)?a:b3.将2,3传入:a=(23)?2:3-------------------------------------------------#defineAREA(r)r*rintmain(){inta=0;a=AREA(2+2);printf(%d\n,a);//结果是8,并不是想像中的16return0;}代码执行的过程:1.a=AREA(2+2)替换成a=AREA(a)2.a=AREA(a)替换成a=a*a3.将2+2传入:a=2+2*2+2=8如果想要得出16,那么改为:#defineAREA(r)(r)*(r)02头文件#include头文件:调用标准库的头文件#include头文件:调用自己写的头文件#includestdio.h//标准库头文件#includetou/test.h//调用tou目录下的test.h文件03条件编译#ifndef宏名//先测试x是否被宏定义过#define宏名程序段1//如果x没有被宏定义过,定义x,并编译程序段1#else程序段2//如果x已经定义过了则编译程序段2的语句,“忽视”程序段1。#endif//终止if可改为#ifndef宏名//先测试x是否被宏定义过#define宏名程序段1//如果x没有被宏定义过,定义x,并编译程序段1#endif//终止if简单来说,如果两个文件都#include了这个头文件,如果a文件先编译了,那么b文件就跳过。防止重复编译。#pragmaonce与#ifndef功能相同,区别在于,如果头文件内容被拷贝多份,那么就没办法保证不会被重复编译。个人比较偏向使用#ifndef#ifdef标识符程序段1#else程序段2#endif如果标识别符被#define定义过,那么就执行程序段1,否则执行程序段2#include#include#include#defineosintmain(){#ifdefosprintf(mac\n);#elseprintf(win\n);#endifsystem(pause);return0;}常用场景:用C语言的编译方式调用程序块,场景C++程序想调用C语言写的库#ifdef__cplusplusexternC{#endif程序块#ifdef__cplusplus}#endif#if常量表达式1程序段1#elif常量表达式2程序段2#elif常量表达式n程序段n#else程序段m#endif*******************************注意:1.常量表达式不能直接处理字符串比较,它只处理整数2.常量表达式的结果必定是真或假。也就是任何可以让结果为真或假的表达式都可以在#if后面(除了字符串比较)*******************************#defineOS0intmain(){#ifOS==1printf(win\n);#elifOS==0printf(linux\n);#elseprintf(mac\n);#endifsystem(pause);return0;}
1
查看完整版本: 编程我是认真的之gcc编译过程