详解C语言之预处理(上)

 更新时间:2021年11月09日 14:28:28   作者:iEucliwood  
这篇文章主要介绍了C语言程序的预处理,小编觉得这篇文章写的还不错,需要的朋友可以参考下,希望能够给你带来帮助

程序的翻译环境

源文件被转换成可执行的机器指令时所处的环境称为翻译环境。

由源文件(.c)转换成可执行文件(.exe)需要两步

 编译通过编译器实现,链接通过链接器实现

每个源文件都会经过编译器处理后生成对应的目标文件,然后链接器将目标文件和链接库链接在一起生成可执行程序

编译和链接的具体操作

编译

编译分为预编译、编译和汇编

预编译:

1.#include<>头文件的包含,即将头文件的引用替换为函数具体的声明。

2.删除注释

3.#define,预处理操作,将define定义的替换为实际值

编译:

将C语言代码翻译为汇编代码

语法分析,词法分析,语义分析,符号汇总(函数名,全局变量)

汇编:

将汇编代码转换为二进制代码,形成符号表

链接

链接分为合并段表和符号表的合并和符号的重定位

合并段表:

目标文件都有一定的格式,分为几个段。链接器会将目标文件的相同的段里的数据合并到一起。

符号表的合并和符号的重定位:

 链接器会将符号表合并为一张表,合并后当符号有冲突时,无效地址将被重新定位为有效地址,即合并后

链接操作完成后可执行程序就生成了

#define的用法

1.#define定义标识符,例如

define定义标识符时最好不要加分号";" 否则容易导致语法错误

2.#define定义宏 

宏的申明方式:

#define name(parament-list) stuff  其中parament-list是由逗号隔开的符号表,可能出现在stuff中

注意:参数的左括号必须与name相邻

下面通过一些代码来看看使用宏时需要注意的问题

 输出结果为11,而非36。问题出在哪呢,我们要明确函数和宏的区别,函数是传递参数的值,而宏是替换参数。#define的实质就是替换。

所以X会替换成表达式5 + 1,5+1*5+1结果显然为11。如果要改进的话在使用宏时可以多加括号,不要吝啬括号

再看另一个例子

我们发现结果依然不是我们想象那样为100,而是55。要知道不仅参数是替换,整个式子也是替换的。则DOUBLE(5)会替换成 (5) + ( 5),那么10*(5)+(5)结果为55,如果要改进的话则依然是加括号

 所以记住一点,使用宏的时候要不要吝啬括号。

 3.#define实现将参数插入到字符串中

实现如下 #会将X变成字符串"X"

 输出结果:

hello aworld

总结

本篇文章就到这里了,希望能够给你带来帮助,也希望您能够多多关注脚本之家的更多内容!

相关文章

  • Qt QGraphicsItem 移动时出现残影问题记录

    Qt QGraphicsItem 移动时出现残影问题记录

    自定义QGraphicsItem时,绘制rect,对象移动时出现残影的问题记录,本文给大家介绍Qt QGraphicsItem 移动时出现残影问题记录,感兴趣的朋友跟随小编一起看看吧
    2024-06-06
  • C/C++标准库之转换UTC时间到local本地时间详解

    C/C++标准库之转换UTC时间到local本地时间详解

    最近遇到一个问题:数据库中存放的时间为UTC时间,但是现在要求都出来显示的时间为本地时间,所以就用C++实现了,下面这篇文章主要给大家介绍了关于C/C++标准库之转换UTC时间到local本地时间的方法,还有C++中获取UTC时间精确到微秒的实现代码,需要的朋友可以参考下。
    2017-11-11
  • C++实现线性表顺序存储的示例代码

    C++实现线性表顺序存储的示例代码

    这篇文章主要为大家详细介绍了C++实现线性表顺序存储的相关知识,文中的示例代码讲解详细,具有一定的学习价值,感兴趣的可以了解一下
    2023-03-03
  • 如何利用Matlab绘制出好看的火山图

    如何利用Matlab绘制出好看的火山图

    火山图是散点图的一种,它将统计测试中的统计显著性量度和变化幅度相结合,从而能够帮助快速直观地识别那些变化幅度较大且具有统计学意义的数据点。本文将通过Matlab绘制好看的火山图,需要的可以参考一下
    2022-03-03
  • 交换两个文本内容的C语言代码

    交换两个文本内容的C语言代码

    这篇文章主要介绍了交换两个文本内容的C语言代码,有需要的朋友可以参考一下
    2013-12-12
  • C++ 输入一行数字(含负数)存入数组中的案例

    C++ 输入一行数字(含负数)存入数组中的案例

    这篇文章主要介绍了C++ 输入一行数字(含负数)存入数组中的案例,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-12-12
  • 基于C++ list中erase与remove函数的使用详解

    基于C++ list中erase与remove函数的使用详解

    本篇文章是对C++ list中erase与remove函数的使用进行了详细的分析介绍,需要的朋友参考下
    2013-05-05
  • 带你了解如何用C++合并两个有序链表

    带你了解如何用C++合并两个有序链表

    这篇文章主要介绍了c++ 如何合并两个有序链表,小编感觉这篇文章还不错,希望能帮助大家更好的理解和学习C++,感兴趣的朋友可以了解下
    2021-08-08
  • getdate()函数的用法实例

    getdate()函数的用法实例

    getdate()函数的用法实例,需要的朋友可以参考一下
    2013-03-03
  • c语言算术运算符越界问题解决方案

    c语言算术运算符越界问题解决方案

    大量的安全漏洞是由于计算机算术运算的微妙细节引起的, 具体的C语言, 诸如符号数和无符号数之间转换, 算术运算的越界都会导致不可预知的错误和安全漏洞, 具体的案例数不胜数.
    2012-11-11

最新评论