C语言预处理程序是不是编译器的一部分,只不过在编译过程中的一个单独的步骤。在简单来说,C语言预处理器只是一个文本替换工具,它们指示编译器实际编译之前需要做预处理。我们参考C语言预处理器如CPP。

所有的预处理命令以一个井号(#)。它必须是第一个非空字符,并且为便于阅读,一个预处理指令应该开始第一列。以下部分列出了所有重要的预处理指令:

指令

描述

#define

替代预处理宏

#include

从另一个文件中插入一个特殊的头

#undef

取消定义预处理宏

#ifdef

返回true,如果这个宏定义

#ifndef

返回true,如果该宏没有被定义

#if

测试是否编译时条件为true

#else

用于可选#if

#elif

#else 一个 #if 在一条语句

#endif

结束预处理条件

#error

stderr上打印错误信息

#pragma

问题特殊命令给编译器,使用一个标准化的方法

预处理程序示例

分析下面的实施例来理解各种指令。

#defineMAX_ARRAY_LENGTH20

这个指令告诉CPP更换MAX_ARRAY_LENGTH实例使用值为20,使用#define定义的常量以增加可读性。

#include#include"myheader.h"

这些指令告诉CPP从系统库得到stdio.h中的文本添加到当前的源文件。下一行告诉CPP获得myheader.h从本地目录和内容添加到当前的源文件。

#undefFILE_SIZE#defineFILE_SIZE42

这告诉CPP取消现有FILE_SIZE定义,并把它定义为42。

#ifndefMESSAGE#defineMESSAGE"You wish!"#endif

这告诉CPP定义只有在MESSAGE尚未定义时,定义MESSAGE。

#ifdefDEBUG/* Your debugging statements here */#endif

这告诉CPP执行过程中,DEBUG是否被定义在语句包围内。如果通过-DDEBUG标志gcc编译器在编译的时候是非常有用的。这将定义DEBUG,这样就可以在编译过程中打开和关闭调试。

预定义宏

ANSI C定义了许多宏。虽然每一个都可以在编程的使用中,预定义的宏不应直接修改。

描述

__DATE__

当前日期作为字符文字“MMM DD YYYY”格式

__TIME__

当前时间作为一个字符文字的“HH:MM:SS”格式

__FILE__

这包含了当前的文件名作为一个字符串

__LINE__

这包含当前行号为十进制常数

__STDC__

定义为1时,编译器符合ANSI标准

让我们来试试下面的例子:

#includemain(){printf("File :%s

",__FILE__);printf("Date :%s

",__DATE__);printf("Time :%s

",__TIME__);printf("Line :%d

",__LINE__);printf("ANSI :%d

",__STDC__);}

当在一个文件test.c的上述代码被编译和执行时,它产生了以下结果:

File :test.c

Date :Jun 2 2012

Time :03:36:24

Line :8

ANSI :1

预处理器运算符

C预处理器提供以下运算符,以帮助创建宏:

宏延续 ()

宏通常必须包含在一行。宏延续运算符用于继续宏太长了的一行。例如:

#definemessage_for(a,b)printf(#a" and "#b ": We love you!

")

字符串大小 (#)

字符串大小或数字符号运算符('#'),当在宏定义中使用,将一个宏参数字符串常量。此运算符可使用仅在具有特定的参数或参数列表的宏。例如:

#include#definemessage_for(a,b)printf(#a" and "#b ": We love you!

")intmain(void){message_for(Carole,Debra);return0;}

让我们编译和运行上面的程序,这将产生以下结果:

Carole and Debra: We love you!

令牌粘贴 (##)

令牌粘贴运算符(##)中的宏定义结合了两个参数。它允许在宏定义两个独立的令牌被加入到一个单一的令牌。例如:

#include#definetokenpaster(n)printf("token"#n " = %d", token##n)intmain(void){inttoken34=40;tokenpaster(34);return0;}

让我们编译和运行上面的程序,这将产生以下结果:

token34 = 40

它是如何发生的,因为这个例子将从预处理器的实际输出结果如下:

printf("token34 = %d",token34);

这个例子显示了令牌 ##n为进令牌34,在这里我们使用了两个字符串和令牌粘贴拼接。

defined() 操作符

预处理器定义的运算符采用的是常量表达式,以确定是否一个标识符使用#define定义。如果指定的标识符被定义,则该值是真(非零)。如果符号没有定义,值为false(零)。定义的运算符规定如下:

#include#if !defined (MESSAGE)#defineMESSAGE"You wish!"#endifintmain(void){printf("Here is the message: %s

",MESSAGE);return0;}

让我们编译和运行上面的程序,这将产生以下结果:

Here is the message: You wish!

参数宏

CPP其中的一个强大的功能是模拟使用参数化的宏功能的能力。例如,我们可能有一些代码方数如下:

intsquare(intx){returnx*x;}

我们可以使用宏如下改写上面的代码:

#definesquare(x)((x)*(x))

宏带参数必须使用#define指令可以在使用之前进行定义。参数列表被括号括起来,而且必须紧跟在宏名。空格在宏观名和左括号之间不允许的。例如:

#include#defineMAX(x,y)((x)>(y)?(x):(y))intmain(void){printf("Max between 20 and 10 is %d

",MAX(10,20));return0;}

让我们编译和运行上面的程序,这将产生以下结果:

Max between 20 and 10 is 20

¥ 我要打赏

纠错/补充

收藏

上一篇:

加QQ群啦,易百教程官方技术学习群

注意:建议每个人选自己的技术方向加群,同一个QQ最多限加 3 个群。

python预处理c语言_C语言预处理器相关推荐

  1. 电子英汉词典c语言程序设计报告,英汉电子词典设计报告_设计_C语言_C语言程序设计.doc...

    英汉电子词典设计报告_设计_C语言_C语言程序设计 课程设计 课程名称 :C语言程序课程设计 题目名称 :电子英汉词典 学生学院 :电气信息学院 专业班级 :自动化1101 学 号 :20110102 ...

  2. python预处理c语言_详解C语言编程中预处理器的用法

    预处理最大的标志便是大写,虽然这不是标准,但请你在使用的时候大写,为了自己,也为了后人. 预处理器在一般看来,用得最多的还是宏,这里总结一下预处理器的用法. #include #define MACR ...

  3. 关于C语言中的预处理器的简单笔记

    在将源代码提交给编译器之前,C语言预处理器将对源代码做出一定修正.预处理器命令有很多如最常用的#include,#define命令. 预处理命令都是以#开头,一般放在代码的最左侧,通常定义的宏全部都是 ...

  4. char类型怎么输入 c语言_C语言程序设计知识点总结(通用)

    微信搜索学生之家考前必备关注我们 <C语言程序设计>知识点总结(通用) 总体上必须清楚的: 1)程序结构是三种:  顺序结构 .选择结构(分支结构).循环结构.  2)读程序都要从main ...

  5. cshop是什么开发语言_C语言是用什么语言编写出来的?

    谢邀 参考 Dennis M. Ritchie 写的 The Development of the C Language:Chistory,C 语言诞生的基本过程就是 Ken Thomson 不满意 ...

  6. python祝福祖国代码_C语言-笔记一

    笔者简介: 本人是现在是在校的一枚研二的学生,最近同实验室的师兄找工作,感觉真心不容易,也让我感到很焦虑,想想现在的我,对编程语言掌握的并不好,糊里糊涂的,想想明年的我,感觉压力很大.所以,每天抽出点 ...

  7. python常用语法和示例_C语言切换案例教程,语法,示例和规则

    python常用语法和示例 使用默认情况下的决策 (Decision making using switch-case-default) Many times in our daily lives, ...

  8. python文件定位函数_C语言中文件定位函数总结

    C语言中文件定位函数主要是:fseek, ftell, fsetpos, fgetpos. 先来讲前两个函数,这是最基本的定位函数: fseek函数:能把文件指针移动到文件任何位置,其原型是:int ...

  9. python编写格斗游戏_C语言实现的开源 2D 格斗游戏: Punch Kick

    <Punch & Kick>是作者在大学期间用C语言开发的2D格斗游戏,其开源主要是面向开发者及编程爱好者,这款游戏并不适合发烧级玩家.审美帝. 下面是作者自己对这个游戏的介绍: ...

  10. python 拟牛顿法 求非线性方程_C语言实现迭代法求非线性方程的根

    迭代法求非线性方程的根 迭代法是一种逐次逼近法.它是求解代数方程,超越方程及方程组的一种基本方法,但存在收敛性及收敛快慢的问题. 为了用迭代法求非线性方程f(x) = 0的近似根: 1.首先需要将此方 ...

最新文章

  1. 苹果测试软件testflight游戏,苹果内测工具TestFlight的使用
  2. 数据结构——堆(转载)
  3. DeepFake疑遭审查
  4. 如何启用 SAP Spartacus Guest checkout
  5. html 树形图可拖拽,HTML5拖拽API实现vue树形拖拽组件
  6. Docker核心组件的关系
  7. 【clickhouse】clickhouse NO DELAY, INTO OUTFILE, SETTINGS, ON, FORMAT, Dot, SYNC, token
  8. Android无线安全测试工具-WiFinSpect
  9. linux 多路径配置
  10. html Table 转CSV中文乱码解决
  11. java毕业设计房产中介系统mybatis+源码+调试部署+系统+数据库+lw
  12. 微软官方Windows7 Ultimate with SP1 DVD 官方简体中文原版下载
  13. sketchup制作模型加载进cesium
  14. 电脑麦克风没声音怎么办?3个方法快速解决
  15. 网络七层协议OSI(Open System Interconnection)
  16. 关于SpringMVC运行项目时出现404错误
  17. button按钮样式
  18. python作业火车票订购系统_Python实现12306火车票查询系统
  19. 达州铭仁园2021年高考成绩查询,达州铭仁园私立中学2021年排名
  20. mblock编程思维开发,自制糖豆人小游戏

热门文章

  1. 笨笨的Zend - RewriteBase
  2. 计算机应用高级教程,大学计算机应用高级教程(第3版)简介,目录书摘
  3. 数据结构与算法(回文数与括号匹配问题)
  4. 【按键】[独立按键] - 2:双击
  5. 关于纯流量卡-物联网卡的一点个人看法
  6. oracle查看密码期限,oracle永久密码和登陆次数无限制设置
  7. EOF in header-net core
  8. 如何快速下载720云高清全景图片
  9. SaaS模式和传统软件模式有什么区别?
  10. 格式塔理论的四个原则_使用格式塔理论改善用户体验