C语言程序设计

您所在的位置:网站首页 预编译头为c++而在c中使用它 C语言程序设计

C语言程序设计

2023-07-15 03:02| 来源: 网络整理| 查看: 265

一、程序的翻译环境和运行环境

在翻译环境中,源代码被转换为可执行的机器指令;在执行环境中,程序实际执行代码。

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