C语言中的预处理器(二)

预定义宏

ANSI C 定义了许多宏。在编程中您可以使用这些宏,但是不能直接修改这些预定义的宏。简而言之,预定义宏就是C中已经定义的量,我们可以使用,但是不能直接修改。

描述
__DATE__ 当前日期,一个以 "MMM DD YYYY" 格式表示的字符常量。
__TIME__ 当前时间,一个以 "HH:MM:SS" 格式表示的字符常量。
__FILE__ 这会包含当前文件名,一个字符串常量。
__LINE__ 这会包含当前行号,一个十进制常量。
__STDC__ 当编译器以 ANSI 标准编译时,则定义为 1。

我们可以看一下实例:

#include 

int main(void)
{
   printf("File :%s\n", __FILE__ );
   printf("Date :%s\n", __DATE__ );
   printf("Time :%s\n", __TIME__ );
   printf("Line :%d\n", __LINE__ );
   printf("ANSI :%d\n", __STDC__ );
}

它会产生如下结果:

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

预处理器运算符

这边我们涉及到4个运算符。

1.宏延续运算符(\)

一个宏通常写在一个单行上,如果太长,可以用该符号折行再写。例如:

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

2.字符串常量化运算符(#)

把宏中所给的参数转化为字符串常量。

#include 

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

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

会有结果:

Carole and Debra: We love you!

3.标记粘贴运算符(##)

##将会合并两个参数成为一个标记,例如n=34,那token##n将会是token34。请看下例:

#include 

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

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

结果如下:

token34 = 40

4.defined() 运算符

预处理器 defined 运算符是用在常量表达式中的,用来确定一个标识符是否已经使用 #define 定义过。如果指定的标识符已定义,则值为真(非零)。如果指定的标识符未定义,则值为假(零)。下面的实例演示了 defined() 运算符的用法:

#include 

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

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

结果输出:

Here is the message: You wish!

参数化的宏

用CPP模拟函数,应该可以长生更高的效率。

#include 

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

int main(void){
  printf("Max between 20 and 10 is %d\n",MAX(20,10));
  printf("The square of 5 is %d\n",SQUARE(5));
  return 0;
}

你可能感兴趣的:(C语言中的预处理器(二))