python预处理c语言_C语言预处理器
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语言预处理器相关推荐
- 电子英汉词典c语言程序设计报告,英汉电子词典设计报告_设计_C语言_C语言程序设计.doc...
英汉电子词典设计报告_设计_C语言_C语言程序设计 课程设计 课程名称 :C语言程序课程设计 题目名称 :电子英汉词典 学生学院 :电气信息学院 专业班级 :自动化1101 学 号 :20110102 ...
- python预处理c语言_详解C语言编程中预处理器的用法
预处理最大的标志便是大写,虽然这不是标准,但请你在使用的时候大写,为了自己,也为了后人. 预处理器在一般看来,用得最多的还是宏,这里总结一下预处理器的用法. #include #define MACR ...
- 关于C语言中的预处理器的简单笔记
在将源代码提交给编译器之前,C语言预处理器将对源代码做出一定修正.预处理器命令有很多如最常用的#include,#define命令. 预处理命令都是以#开头,一般放在代码的最左侧,通常定义的宏全部都是 ...
- char类型怎么输入 c语言_C语言程序设计知识点总结(通用)
微信搜索学生之家考前必备关注我们 <C语言程序设计>知识点总结(通用) 总体上必须清楚的: 1)程序结构是三种: 顺序结构 .选择结构(分支结构).循环结构. 2)读程序都要从main ...
- cshop是什么开发语言_C语言是用什么语言编写出来的?
谢邀 参考 Dennis M. Ritchie 写的 The Development of the C Language:Chistory,C 语言诞生的基本过程就是 Ken Thomson 不满意 ...
- python祝福祖国代码_C语言-笔记一
笔者简介: 本人是现在是在校的一枚研二的学生,最近同实验室的师兄找工作,感觉真心不容易,也让我感到很焦虑,想想现在的我,对编程语言掌握的并不好,糊里糊涂的,想想明年的我,感觉压力很大.所以,每天抽出点 ...
- python常用语法和示例_C语言切换案例教程,语法,示例和规则
python常用语法和示例 使用默认情况下的决策 (Decision making using switch-case-default) Many times in our daily lives, ...
- python文件定位函数_C语言中文件定位函数总结
C语言中文件定位函数主要是:fseek, ftell, fsetpos, fgetpos. 先来讲前两个函数,这是最基本的定位函数: fseek函数:能把文件指针移动到文件任何位置,其原型是:int ...
- python编写格斗游戏_C语言实现的开源 2D 格斗游戏: Punch Kick
<Punch & Kick>是作者在大学期间用C语言开发的2D格斗游戏,其开源主要是面向开发者及编程爱好者,这款游戏并不适合发烧级玩家.审美帝. 下面是作者自己对这个游戏的介绍: ...
- python 拟牛顿法 求非线性方程_C语言实现迭代法求非线性方程的根
迭代法求非线性方程的根 迭代法是一种逐次逼近法.它是求解代数方程,超越方程及方程组的一种基本方法,但存在收敛性及收敛快慢的问题. 为了用迭代法求非线性方程f(x) = 0的近似根: 1.首先需要将此方 ...
最新文章
- 苹果测试软件testflight游戏,苹果内测工具TestFlight的使用
- 数据结构——堆(转载)
- DeepFake疑遭审查
- 如何启用 SAP Spartacus Guest checkout
- html 树形图可拖拽,HTML5拖拽API实现vue树形拖拽组件
- Docker核心组件的关系
- 【clickhouse】clickhouse NO DELAY, INTO OUTFILE, SETTINGS, ON, FORMAT, Dot, SYNC, token
- Android无线安全测试工具-WiFinSpect
- linux 多路径配置
- html Table 转CSV中文乱码解决
- java毕业设计房产中介系统mybatis+源码+调试部署+系统+数据库+lw
- 微软官方Windows7 Ultimate with SP1 DVD 官方简体中文原版下载
- sketchup制作模型加载进cesium
- 电脑麦克风没声音怎么办?3个方法快速解决
- 网络七层协议OSI(Open System Interconnection)
- 关于SpringMVC运行项目时出现404错误
- button按钮样式
- python作业火车票订购系统_Python实现12306火车票查询系统
- 达州铭仁园2021年高考成绩查询,达州铭仁园私立中学2021年排名
- mblock编程思维开发,自制糖豆人小游戏