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 个群。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值