C语言程序设计 |
您所在的位置:网站首页 › 预编译头为c++而在c中使用它 › C语言程序设计 |
一、程序的翻译环境和运行环境
在翻译环境中,源代码被转换为可执行的机器指令;在执行环境中,程序实际执行代码。 1.翻译环境翻译环境中,先是编译器执行编译命令,然后是链接器执行链接命令。 编译过程分为预编译、编译、汇编三个过程,最后生成目标文件。 连接过程将生成的目标文件转换为可执行程序。 注意点:1.组成一个程序的每个源文件通过编译过程分别转换成目标代码(object code); 2.每个目标文件由链接器捆绑在一起,形成一个单一而完整的可执行程序; 3.链接器会引入标准C函数库中的任何被该程序所用到的函数,同时也搜索程序员个人程序库并将需要的函数链接到程序当中。 (1)预编译阶段[.c -> .i]① #include 头文件的包含。将头文件展开。 ②注释删除。将注释使用空格进行替换。 ③#define。将代码中的定义的宏与常量进行替换。 (2)编译阶段[.i -> .s]将c语言代码翻译成汇编代码。 ①语法分析。 ②词法分析。 ③语义分析。 ④符号汇总。 (3)汇编阶段[.s -> .o]①形成符号表。符号表是代码内的函数和变量所对应的地址。 ②把汇编代码转换成为二进制指令。 (4)链接阶段①合并段表。 ②符号表的合并和重定位。 2、运行环境程序先载入内存中,开始执行后先调用main函数,然后执行程序代码,之后终止程序。 二、预处理详解 1.预定义符号__FILE__ // 进行编译的文件(绝对位置) __LINE__ // 文件当前的行号 __DATE__ // 文件被编译的日期 __TIME__ // 文件被编译的时间 __STDC__ // 在编译C11和C17代码时将其设置为1 int main() { printf("%s\n",__FILE__); printf("%d\n",__LINE__); printf("%s\n",__DATE__); printf("%s\n",__TIME__); return 0; } 2.#define (1)#define定义标识符#define name stuff #define MAX 1000 #define reg register #define do_forever for(;;) #define CASE break;case (2)#define定义宏文本纯替换。 #define name( parament-list ) stuff 其中parament-list时一个由逗号隔开的符号表,它们可能出现在stuff中。参数列表的左括号必须与name紧邻。 #define SQUARE(x) x*x SQUARE(5); // 5*5 为25 SQUARE(5+1); // 5+1*5+1 为11 #define SQUARE(x) ((x)*(x))#define定义宏替换是严格的“复制粘贴”,所以在定义宏时,需要对整体以及局部加上括号,以免产生不可预料的后果。 (3)#和###可以把一个宏参数变成对应的字符串 #define PRINT(X) printf("the value of "#X" is %d\n",X); int main() { int a = 10; int b = 20; PRINT(a); //the value of a is 10 PRINT(b); //the value of b is 20 return 0; }##可以把两边的符号合并成一个符号 #define ADD_TO_SUM(num,value) sum##num += value; ADD_TO_SUM(5,10); // sum5 += 10; (4)undef这条指令用于移除一个宏定义。 3.条件编译#if 常量表达式 //... #elif 常量表达式 //... #else //... #endif 判断是否被定义 #if defined(symbol) #ifdef symbol #if !defined(symbol) #ifndef symbol 4.文件包含#include 库文件包含: 本地文件包含:“” |
CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3 |