C语言-预处理器

预处理器指令:

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

C 预处理器实例

常见预处理指令

  • #define
  • #include
  • #undef
  • #ifndef 与 #endif

示例如下:

定义最大高度

#define MAX_HEIGHT 80

这个指令告诉 CPP 把所有的 MAX_HEIGHT 替换为 80。使用 #define 定义常量来增强可读性。

#undef  MAX_HEIGHT
#define MAX_HEIGHT 100

上面这个表示 取消已定义的 MAX_HEIGHT,并定义它为 100,其实就是一个重定义或着覆盖!

#ifdef DEBUG
   /** You debug statement ... **/
#endif

这个指令表示如果是DEBUG模式的话,就执行这里面的语句!常常用于多环境中!

引入头文件示例

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

用<> 引入的头文件表示从系统库引入,用双引号表示从当前源文件中引入, 通过#include 就可以把它们相关的东西引入到代码里!

C 预定义宏

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

它们各自的value 如下

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int main()
{

   printf("__FILE__ :%s\n", __FILE__ );
   printf("__DATE__ :%s\n", __DATE__ );
   printf("__TIME__ :%s\n", __TIME__ );
   printf("__LINE__ :%d\n", __LINE__ );
   printf("__STDC__ :%d\n", __STDC__ );

    return 0;
}

运行结果为:

__FILE__ :D:\dev\workspace_c\Test\main.c
__DATE__ :Aug 23 2020
__TIME__ :20:17:34
__LINE__ :17
__STDC__ :1

C 预处理器运算符

  • 宏延续运算符(\)
#define  myLog(a, b)  \
    printf("myLog " #a " and " #b "\n")
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#define  myLog(a, b)  \
    printf("myLog: " #a " and " #b "\n")

int main()
{
   myLog("a", "b");
    return 0;
}

运行结果如下:

myLog: "a" and "b"
  • 标记粘贴运算符(##)

宏定义内的标记粘贴运算符(##)会合并两个参数。它允许在宏定义中两个独立的标记被合并为一个标记。例如:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#define myLog(n) printf ("myLog:" #n " = %d", test##n)

int main()
{
    int test34 = 40;
    myLog(34);
    return 0;
}

运行结果

myLog:34 = 40

上面是编译器把上面输出代码编译成

printf ("myLog:34 = %d", test34);
  • defined() 运算符
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#if !defined (DEF_NAME)
   #define DEF_NAME "Hello Pangugle!"
#endif

int main()
{
    printf("rs = %s\n", DEF_NAME);
    return 0;
}

运行结果为

rs = Hello Pangugle!

C 宏参数化

求最后值

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#define MIN(x, y) ((x)<(y)?(x):(y))

int main()
{
    printf("3 和 4两个最小值是: %d", MIN(3, 4));
    return 0;
}

运行结果为

3 和 4两个最小值是: 3

注意:

  • 使用带有参数的宏之前,必须使用 #define 指令定义。
  • 参数列表是括在圆括号内,且必须紧跟在宏名称的后边。
  • 宏名称和左圆括号之间不允许有空格