English 中文(简体)
C. 加工商
  • 时间:2024-09-17

C - Preprocessors


Previous Page Next Page  

C 预处理器 不是汇编者的一部分,而是汇编过程中的一个单独步骤。 简言之,C Preprocessor只是一种案文替代工具,它指示汇编者在实际汇编之前做必要的预处理。 我们把C Preprocessor称为CPP。

所有前处理器的指挥均以散射文号(#)开始。 它必须是第一个不空白的特性,对于可读性来说,先处理者指令应在第一栏开始。 以下各节列出了所有重要的加工前指令——

Sr.No. Directive & Description
1

#define

替代加工前的宏观。

2

#include

从另一个档案中插入一个特别标题。

3

不确定的是加工前宏观。

4

#ifdef

如果确定这一宏观方法,回归就属实。

5

#ifndef>

如果不界定这一宏观因素,就会出现真正的回归。

6

如果是汇编时间条件,则进行测试。

7

<#else>

替代标准。

8

页: 1

9

终端处理前条件。

10

页: 1

斜线上的印刷错误信息。

11

#pragma

采用标准化方法向汇编者发布特别指挥。

Preprocessors Examples

分析以下例子,以了解各种指示。

#define MAX_ARRAY_LENGTH 20

这项指令告诉购买力平价,用20个数字取代Lex_ARRAY_LENGTH。 使用#define,用于增加可读性。

#include <stdio.h>
#include "myheader.h"

这些指示将CPP从System Libraries带走,并将案文添加到目前的来源档案中。 下一条线指CPP获得myheader.h。 从当地目录中删除,并将内容添加到现有来源档案中。

#undef  FILE_SIZE
#define FILE_SIZE 42

它告诉加拿大人民党,不要忘记现有的国际自由论坛。 SIZE, 并将其定义为42。

#ifndef MESSAGE
   #define MESSAGE "You wish!"
#endif

它告诉加拿大竞争主管机构,只有MESSAGE已经界定了。

#ifdef DEBUG
   /* Your debugging statements here */
#endif

它告诉加拿大人民党,如果确定数字,将处理所附声明。 如果你在汇编时通过-DDEBUG旗帜给电梯编辑,则这样做是有益的。 这将界定德国航天中心,因此,在汇编过程中,你可以转而浏览该传单。

Predefined Macros

ANSI C界定了一些宏观。 虽然每个方案都可以用于方案拟订,但事先确定的宏观办法不应直接修改。

Sr.No. Macro & Description
1

本日为“MMM DD YYYY”格式的特性。

2

目前的特征是“HHH:MM:SS”格式。

3

其中载有目前档案名称作为直面字。

4

现有线数为少数。

5

在汇编者遵守ANSI标准时,定义为1。

举几个例子:

#include <stdio.h>

int main() {

   printf("File :%s
", __FILE__ );
   printf("Date :%s
", __DATE__ );
   printf("Time :%s
", __TIME__ );
   printf("Line :%d
", __LINE__ );
   printf("ANSI :%d
", __STDC__ );

}

如果在文件测试.c中汇编和执行上述代码,则会产生以下结果:

File :test.c
Date :Jun 2 2012
Time :03:36:24
Line :8
ANSI :1

Preprocessor Operators

C 加工商向以下经营者提供帮助创造宏观产品——

The Macro Continuation () Operator

宏观通常限于一行。 宏观继续经营人()用于维持一个太长的单行。 例如:

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

The Stringize (#) Operator

在宏观定义中使用强度或编号操作者(第......号)时,将宏观参数转换成直线不变。 这种经营者只能用于具有特定论点或参数清单的宏观。 例如:

#include <stdio.h>

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

int main(void) {
   message_for(Carole, Debra);
   return 0;
}

如果上述法典得到编纂和执行,则会产生以下结果:

Carole and Debra: We love you!

The Token Pasting (##) Operator

在宏观定义中,象征性的投产者(#)结合了两个论点。 它允许将宏观定义中的两条单独标注并入一个标注。 例如:

#include <stdio.h>

#define tokenpaster(n) printf ("token" #n " = %d", token##n)

int main(void) {
   int token34 = 40;
   tokenpaster(34);
   return 0;
}

如果上述法典得到编纂和执行,则会产生以下结果:

token34 = 40

之所以出现这种情况,是因为这一例子使加工商的实际产出如下:

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

这一例子表明,把“标的”号划入“象征性”34,我们在此同时使用了stringizetoken-pasting

The Defined() Operator

预先处理器界定的操作器在固定表述中加以使用,以确定识别符号是否使用标准。 如果确定具体识别符号,该数值是真实的(非零)。 如果对符号未作界定,其价值为虚假(零)。 定义的运营商具体如下:

#include <stdio.h>

#if !defined (MESSAGE)
   #define MESSAGE "You wish!"
#endif

int main(void) {
   printf("Here is the message: %s
", MESSAGE);  
   return 0;
}

如果上述法典得到编纂和执行,则会产生以下结果:

Here is the message: You wish!

Parameterized Macros

购买力平价的强大功能之一是能够利用参数宏观模拟功能。 例如,我们可能有以下一些法典:

int square(int x) {
   return x * x;
}

我们可以使用以下宏观方法在法典之上重写:

#define square(x) ((x) * (x))

必须使用#define指令来界定有争论的Macros,然后才能使用。 论点清单载于括号中,必须立即遵循宏观名称。 不允许在宏观名称和开放的括号之间使用空间。 例如:

#include <stdio.h>

#define MAX(x,y) ((x) > (y) ? (x) : (y))

int main(void) {
   printf("Max between 20 and 10 is %d
", MAX(10, 20));  
   return 0;
}

如果上述法典得到编纂和执行,则会产生以下结果:

Max between 20 and 10 is 20
Advertisements