飞书文档https://x509p6c8to.feishu.cn/wiki/DzSJwsGiTiXkeCkyEYUcuXbKnbf
C 预处理是编译过程中一个单独的步骤,是一个文本替换工具而已。所有的预处理命令都是以井号(#)开头。
指令 | 描述 |
#define | 定义宏 |
#ifdef | 如果宏已经定义,则返回真 |
#ifndef | 如果宏没有定义,则返回真 |
#endif | 结束一个 #if……#else 条件编译块 |
#define
#define MAX_ARRAY_LENGTH 20 |
这个指令告诉编译器把所有的 MAX_ARRAY_LENGTH 定义为 20。使用 #define 定义常量来增强可读性。
#include <stdio.h>
#define MESSAGE "You wish!"
#define MAX_ARRAY_LENGTH 20
int main(void)
{printf("Here is the message: %s\n", MESSAGE);printf("max array length : %d\n", MAX_ARRAY_LENGTH ); return 0;
}
当上面的代码被编译和执行时,它会产生下列结果:
Here is the message: You wish!
max array length : 20
#define更多用法
宏定义函数
C语言一个强大的功能是可以使用参数化的宏来模拟函数。例如,
int square(int x) {return x * x;
}
我们可以使用宏重写上面的代码,如下:
#define square(x) ((x) * (x))
在使用带有参数的宏之前,必须使用 #define 指令定义。参数列表是括在圆括号内,且必须紧跟在宏名称的后边。宏名称和左圆括号之间不允许有空格。例如:
#include <stdio.h>#define square(x) ((x) * (x))int main(void)
{printf("10*10=%d\n", square(10)); return 0;
}
宏延续运算符(\)
一个宏通常写在一个单行上。但是如果宏太长,一个单行容纳不下,则使用宏延续运算符(\)。例如:
#define square(x) \((x) * (x))
标记粘贴运算符(##)
宏定义内的标记粘贴运算符(##)会合并两个参数。它允许在宏定义中两个独立的标记被合并为一个标记。例如:
#include <stdio.h>#define tokenpaster(n) printf ("token = %d", token##n)int main(void)
{int token34 = 40;tokenpaster(34);return 0;
}
当上面的代码被编译和执行时,它会产生下列结果:
token = 40
#ifndef
#ifndef TEST#define MESSAGE "You wish!"
#endif
这个指令告诉编译器只有当 MESSAGE 未定义时,才定义 MESSAGE,常用于头文件,防止重复引用。
C |
#ifdef
#ifdef DEBUG |
这个指令告诉 CPP 如果定义了 DEBUG,则执行处理语句,常用于编译选择,例如下发工程,如果我们只希望在调试时打印信息,正式发布不打印信息。
#include <stdio.h>#define DEBUG
#ifdef DEBUG#define MESSAGE "You wish!"
#endifint main(void)
{#ifdef DEBUGprintf("Here is the message: %s\n", MESSAGE);#endifreturn 0;
}