C[6] 预处理器

C[6] 预处理器

预处理器指编译器在实际编译之前完成所需的预处理。C 预处理器(C Preprocessor)简写CPP。它不是编译器的组成部分,是编译过程中一个单独的步骤(可以理解为文本替换工具)。

1、预处理器指令(以(#)号开头。)

  • #define   //定义宏
  • #include   //包含一个源代码文件
  • #undef   //取消已定义的宏
  • #ifdef   //如果宏已经定义,则返回真
  • #ifndef   //如果宏没有定义,则返回真
  • #if      //如果给定条件为真,则编译下面代码
  • #else   //#if 的替代方案
  • #elif     //如果前面的 #if 给定条件不为真,当前条件为真,则编译下面代码
  • #endif   //结束一个 #if……#else 条件编译块
  • #error   //当遇到标准错误时,输出错误消息
  • #pragma   //使用标准化方法,向编译器发布特殊的命令到编译器中

示例:

#define MAX_LENGTH 10    //定义常量  把所有的 MAX_LENGTH 的值替换为 10
#include <stdio.h>    // 从系统库中获取 stdio.h,并添加文本到当前的源文件中
#include "myTest.h"   // 从本地目录中获取 myTest.h,并添加内容到当前的源文件中。
#undef  FILE_SIZE    //取消已定义的 FILE_SIZE 值
#define FILE_SIZE 20   //重新定义FILE_SIZE的值为20
//当 MESSAGE 未定义时,定义 MESSAGE的值。
#ifndef MESSAGE
   #define MESSAGE "Hello TaoRoy!"
#endif

2、预处理器运算符  

2.1 连接或延续 运算符(\) 和  字符串常量化运算符(#)

#include <stdio.h>
#define  PrintMessage(a, b)  \     //宏通常写在单行上,太长,则使用“\”运算符连接
    printf(#a#b ": i am fine!\n")    //“#”把一个宏的参数转换为字符串常量.    结果:TaoRoy:i am fine!

int main(void)
{
   PrintMessage(Tao,Roy);
   return 0;
}

2.2 标记粘贴运算符(##)

#include <stdio.h>
#define Test(a) printf ("Tao" #a " = %d", Tao##a) //(##)合并两个参数(Tao 和 a)

int main(void)
{
  int Tao520 = 1314;
  Test(520); //输出:Tao520 = 1314
  return 0;
}

2.3 defined() 运算符

#include <stdio.h>
#if !defined (MESSAGE) //如果没有定义 MESSAGE 这个宏的值,则定义
  #define MESSAGE "Hello TaoRoy!"
#endif

int main(void)
{
  printf("Output: %s\n", MESSAGE); //输出:Output:Hello TaoRoy!
  return 0;
}

3、宏的参数化( #define )

#include <stdio.h>
/* 
int XiangJia(int x) {
   return x + x;
}
 */
#define XiangJia(x) ((x) + (x))    //模拟函数 XiangJia  
#define Max(x,y) ((x) > (y) ? (x) : (y))
//注意:参数列表是括在圆括号内,且必须紧跟在宏名称的后边。宏名称和左圆括号之间不允许有空格。

int main(void)
{
   printf("1相加的值: %d\n", XiangJia(1));     //输出:1相加的值:2
   printf("1和2最大值是: %d\n", Max(1, 2));    //输出:1和2最大值是:2
   return 0;
}

4、其他预定义的宏(可以使用,但是不能直接修改)

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

示例:

#include <stdio.h>
main()
{
   printf("Date :%s\n", __DATE__ );
   printf("Time :%s\n", __TIME__ );
   printf("Line :%d\n", __LINE__ );
   printf("ANSI :%d\n", __STDC__ );
   printf("File :%s\n", __FILE__ );
}

 

  

  

 

 

 

创建时间:2021.11.04  更新时间:

posted on 2021-11-04 11:03  滔Roy  阅读(121)  评论(0编辑  收藏  举报

导航