C语言难点2之预处理器

C语言难点2之预处理器

1 预处理阶段

在预处理阶段中,C预处理器在源代码编译之前对其进行一些文本性质的操作。它的主要任务包括删除注释,插入被#include指定包含的文件的内容,定义和替换由#define指令定义的符号一起确定代码的部分内容是否应该根据一些条件编译指令进行编译。

2 #define命令

采用宏定义时候的易错点:

格式:

#define  name  stuff

有了这条指令之后,每当有符号name出现在这条指令后面时,预处理器就会把它替换成stuff。

注意:宏定义后面不能加上分号;

#define机制包括了一个规定,允许把参数替换到文本中,这周实现通常称为宏或者定义宏;

格式:

#define      name(parameter-list)     stuff

其中,parameter list是UI个由符号分割的符号列表,他们可能出此案在stuff中。

注意:(1)参数列表的左括号必须与name紧邻。如果两者之间由任何空白存在,参数列表就会被解释成stuff的一部分。

(2)注意括号的使用,由于运算顺序的不同,加不加括号会直接影响结果的。

举例:

3 #define替换步骤

4 把宏参数插入到字符串中

两种技巧:

首先,邻近字符串自动连接的特性使我们很容易吧一个字符串分成几段,没段实际上都是一个宏参数。

例如:

第二个技巧使用预处理器把宏参数转换成一个字符串,#argument这种结构被预处理器翻译为“argument”。这种

例如:

注意,一种用的比较奇特的是使用##结构,它把位于它两边的符号连接成为一个符号。作为用途之一,它允许宏定义从分离的文本片段创建标识符。

例如:

5 带副作用的宏参数

就是参数每次使用的时候都会是最初始的数值,不会因为处理的变化而变化,我们在上面的第2部分谈到过。

6 宏和函数的比较

7 #undef命令

指令格式

#undef name

如果一个现存的名字需要被重新定义,那么它的旧定义首先必须用#undef移除。

8 条件编译

完整的语法:

9 是否被定义

有时候需要判断一个符号是否被定义,使用如下语句中的任意一句都可以

10 文件包含

#include指令:预处理器删除这条指令,并用包含文件的内容取而代之。

如果一个头文件被包含到10个源文件中,它实际上被编译了10次。

库函数包含:#include <filename>

本地文件包含:#include "filename"

11 其他的指令

错误指令: #error    text of error message    这个指令允许你生成错误信息

#line 指令  : #line   number "string"

12 编程提示的总结

时间: 2024-10-23 05:44:42

C语言难点2之预处理器的相关文章

【腾讯开源】前端预处理器语言图形编译工具 Koala使用指南

摘要:Koala是一款预处理器语言图形编译工具,支持Less.Sass.CoffeeScript.Compass框架的即时编译.无需手动输入命令去编译,后台监听文件是否有改变,如有修改会自动进行编译,能够大大提升Web开发中的工作效率. 近期,我们对腾讯Koala团队进行了专访 ,一款预处理器语言图形编译工具,支持Less.Sass.CoffeeScript.Compass框架的即时编译.本篇文章为大家着重介绍Koala工具的使用进行讲解,以供参考. Koala代码托管地址: https://c

C语言预处理器的几个命令

C语言预处理器是个简单的的宏处理器,预处理器用特殊的命令行控制,这些命令行以#开头,不包含预处理器命令的行称为源程序文本行.预处理器通常从源文件中删除所有预处理器命令行,并按预处理器命令指示对源文件进行其它转换,然后,得到的经过预处理的源文本成为有效C语言程序. 下面是常见的预处理器命令: #define--定义预处理器宏,如果是函数式宏定义,左括号与宏名之间不能有空格,所有参数及整个宏替换最好分别放在圆括号里,参数可以是可变参数表,以...表示,用__VA_ARGS__替换,传人参数包含自赠自

C预处理器

C预处理器是一种简单的宏处理器. 预处理器是由特殊的预处理器命令行控制的,它们是以#符号开头的源文件行. 预处理器的一般操作:从源文件中删除所有的预处理器命令行,并在源文件中执行这些预处理器命令所指定的转换操作 预处理器代码行的语法与C语言其他部分的语法是完全独立的,但经过预处理所产生的源代码必须在上下文环境中合法 常见的预处理器命令: #define  定义一个预处理器宏   #undef     取消一个预处理器宏 #include   插入另一个源文件的文本 #if        测试一个

笔记3:预处理器-(2)宏定义

#define指令称为宏定义指令,通常用#define指令来定义一个宏用来代表其他东西的一个名字(如常量表达式等).通常来说预处理器会通过将宏的名字和它的定义存储在一起来响应#define指令.当这个宏在后面的程序中使用到时,预处理器会"扩展"宏,将宏替换为其定义值. 简单的宏 简单的宏的定义格式: #define 标识符 替换列表 如: #define DTE_LEN 80 #define TRUE 1 #define FALSE 0 #define PI 3.1415926 #de

C Primer Plus之C预处理器和C库

编译程序前,先由预处理器检查程序(因此称为预处理器).根据程序中使用的预处理器指令,预处理器用符号缩略语所代表的内容替换程序中的缩略语. 预处理器不能理解C,它一般是接受一些文件并将其转换成其他文本. 翻译程序的第一步 对程序作预处理前,编译器会对它进行几次翻译处理. 编译器首先把源代码中出现的字符映射到源字符集(?).该过程处理多字节字符和使C外观更加国际化的三元字符(?)扩展 编译器查找反斜线(\)后紧跟换行符的实例并删除这些实例.注意:在这种场合下,“换行符”代表按下回车键在源代码文件中新

C Primer Plus读书笔记-预处理器指令

代码中经常看到  #define ,#ifdef #define :明显常量 一般的指令长度仅限与一行代码,除了\(反斜杠线)可以拓展到下一行外. 一般情况下,每个#define行由三个部分组成. 第一部分为#define 指令本身 第二部分为所选择的缩略语,这些缩略语称为宏(macro).  宏的名字中不允许有空格!只能使用字母,下划线(_),和数字之间的组合,第一个字符不能为数字 第三部分(#define行除了第一第二部分外的部分).称为替换列表或主体. 预处理器在程序中发现宏的实例后,总会

C和C++的面向对象专题(8)——更为高级的预处理器PHP

本专栏文章列表 一.何为面向对象 二.C语言也能实现面向对象 三.C++中的不优雅特性 四.解决封装,避免接口 五.合理使用模板,避免代码冗余 六.C++也能反射 七.单例模式解决静态成员对象和全局对象的构造顺序难题 八.更为高级的预处理器PHP 八.更为高级的预处理器PHP C++的宏在某些情况下非常难用,例如将代码展开成为这样: Macro( A, B, C, D ) => func("A", A); func("B", B); func("C&

【C/C++】C预处理器

C预处理器处理程序的源代码,在编译器之前运行,通常以"#"开头. C语言的预处理主要有三个言而的内容: 1) 宏定义和宏替换: 2) 文件包含: 3) 条件编译. 1. 宏定义和宏替换 "宏"是借用汇编语言中的概念,为的是在C语言程序中方便的作一些定义和扩展.这些语句以#define开头,分为两种:符号常量的宏定义和带参数的宏定义. 1) 符号常量的宏定义和宏替换 1 #define 标识符 字符串 其中标识符就称为宏名称,注意宏定义末尾不加分号. 由于预处理是在编

一些C#预处理器指令

像C语言一样,C#有一些预处理器指令的命令.例如,#if#end if,#define等,所谓这些命令是指不会转化为可执行代码中的一些命令,只是在编译的过程中起作用.下面简要介绍一下:1 .#define和 #undef#define的用法如下所示:#define DEBUG 它告诉编译器存在给定名称的符号,在本例中是DEBUG.这有点类似于声明一个变量,但这个变量并没有真正的值,只是存在而已.这个符号不是实际代码的一部分,而只在编译器编译代码时存在.在C#代码中它没有任何意义.#undef正好