C预处理器是一个文本替换工具,在实际编译之前完成一些预先的处理。

C预处理器(C Preprocessor)简写为 CPP

预处理器命令都是以#开头,如:

#include <stdio.h>
包含源代码文件stdio.h

#define定义宏

  1. 代码文本替换
  2. 增强可读性
#define MAX_ARRAY_LENGTH 20
main () {
/*
*把所有的MAX_ARRAY_LENGTH 替换为20
*#define:增强可读性
*/
char a1[MAX_ARRAY_LENGTH];
char a2[MAX_ARRAY_LENGTH];
char a3[20];
}

系统提供的预定义宏

DATE 当前日期 字符串常量
TIME 当前时间 字符串常量
FILE 当前文件名 字符串常量
LINE 当前行号 十进制数字常量
puts(__DATE__);
puts(__TIME__);
puts(__FILE__);
printf("%d",__LINE__);

条件编译

  • 定义一个非0的宏
#include <stdio.h>
#define DEBUG 1
main(void) {
#if DEBUG
printf("Debug模式");
#else
printf("Release模式");
#endif
}
  • defined:专用于预处理器的运算符,只要定义无需具体内容
#include <stdio.h>
#define DEBUG
main(void) {
#if defined(DEBUG)
printf("Debug模式");
#else
printf("Release模式");
#endif
}

#undef取消已定义的宏

带参数的宏

  • 带参数的宏经常用来作为简单的函数使用。
  • 宏名字和左括号间必须没有空格。
  • 比函数速度稍微快一些(函数需要存储上下文信息、复制参数值等)。
  • 宏参数没有类型,更通用。
  • 每次调用宏都有代码替换,编译后代码会变大。
#include <stdio.h>
#define MAX(x,y) (x>y?x:y)
main(void) {
int i = MAX(1,2);
// →int i = (1>2?1:2);
printf("%d",i);
}
#include <stdio.h>
#define IS_EVEN(n) (n%2==0)
main(void) {
int i = IS_EVEN(20);
// →int i = (20%2==0);
printf("%d\n",i);
int j = IS_EVEN(21);
// →int i = (21%2==0);
printf("%d\n",j);
}

*字符串常量化(#)

#include <stdio.h>
#define func(a) printf("我乃是")
int main(void) {
func("五百年前大闹天宫的齐天大圣");
return 0;
}
#include <stdio.h>
#define func(a) printf("我乃是"#a)
int main(void) {
func(五百年前大闹天宫的齐天大圣);
return 0;
}

宏换行(\)

#include <stdio.h>
#define func(a) \
printf("我乃是"#a)
int main(void) {
func(五百年前大闹天宫的齐天大圣);
return 0;
}

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

  • 将两个标记“粘合”在一起。

    如:MAX函数,只能用于某一特定的类型,如果既要适用于int,又要适用于float,就需要定义两个函数,函数体完全一样。如果还要再适用于long,double等,重复代码将会更多。
#include <stdio.h>
int int_max(int x,int y) {
return x>y?x:y;
}
float float_max(float x,float y) {
return x>y?x:y;
}
main(void) {
printf("%d\n",int_max(1,2));
printf("%f\n",float_max(1.2,2.3));
}
#include <stdio.h>
#define GENERIC_MAX(t) \
t t##_max(t x,t y)\
{\
return x>y?x:y;\
}
GENERIC_MAX(int);
GENERIC_MAX(float);
main(void) {
printf("%d\n",int_max(1,2));
printf("%f\n",float_max(1.2,2.3));
}

C语言讲义——预处理的更多相关文章

  1. C语言: 预处理

    1. 字符映射 键盘有多种标准规格,例如常用的IBM 104键盘标准,然而不是所有键盘都能打出像#这样的符号,因此C语言的预处理引入了字符映射机制.如果程序员要求,预处理会按照约定对源代码中的字符进行 ...

  2. C语言之预处理命令

    /**************************************************************************** Title:C之预处理命令 Time:201 ...

  3. R语言数据预处理

    R语言数据预处理 一.日期时间.字符串的处理 日期 Date: 日期类,年与日 POSIXct: 日期时间类,精确到秒,用数字表示 POSIXlt: 日期时间类,精确到秒,用列表表示 Sys.date ...

  4. C语言之预处理详解

    C语言之预处理详解 纲要: 预定义符号 #define #define定义标识符 #define定义宏 #define的替换规则 #与## 几点注意#undef 带副作用的宏参数 宏和函数的对比 命名 ...

  5. C语言之预处理

    这是2016年的最后一篇博客,年初定的计划是写12篇博客,每月一篇,1/3转载,2/3原创,看来是实现不了了! -- 题外话.今天要写的东西是C语言中的预处理器,我们常说的宏定义的用法.为什么要写这个 ...

  6. iOS开发系列--C语言之预处理

    概述 大家都知道一个C程序的运行包括编译和链接两个阶段,其实在编译之前预处理器首先要进行预处理操作,将处理完产生的一个新的源文件进行编译.由于预处理指令是在编译之前就进行了,因此很多时候它要比在程序运 ...

  7. Linux C编程学习之C语言简介---预处理、宏、文件包含……

    C的简介 C语言的结构极其紧凑,C语言是一种模块化的编程语言,整个程序可以分割为几个相对独立的功能模块,模块之间的相互调用和数据传递是非常方便的 C语言的表达能力十分强大.C语言兼顾了高级语言和汇编语 ...

  8. 【C语言入门教程】2.8 C 语言的预处理命令

    预处理命令是在程序编译阶段进行执行的命令,用于编译与特定环境相关的可执行文件.预处理命令扩展了 C 语言,本节将选择其中一些常用的预处理命令进行讲解. 2.8.1 宏替换命令 宏替换命令的作用类似于对 ...

  9. c语言编译预处理和条件编译执行过程的理解

    在C语言的程序中可包括各种以符号#开头的编译指令,这些指令称为预处理命令.预处理命令属于C语言编译器,而不是C语言的组成部分.通过预处理命令可扩展C语言程序设计的环境. 一.预处理的工作方式 1.1. ...

随机推荐

  1. python基础二:循环

    python 中循环的方式有两种: 一,for 循环  单向循环 可以用来遍历字符串,列表,元组,字典等 for value in 被遍历对象: print(value) 遍历字典dict的时候稍有不 ...

  2. 需要加强NB-IoT网络优化和终端监管

    NB-IoT解决方案在行业规模商用应用中得到了持续的验证,承受住考验,现在芯片和网络问题和障碍已经得到解决. 从统计结果来看,目前的绝大多数问题都集中在终端侧,因为行业的定制化需求以及合伙伙伴的能力差 ...

  3. K8S环境快速部署Kafka(K8S外部可访问)

    欢迎访问我的GitHub https://github.com/zq2599/blog_demos 内容:所有原创文章分类汇总及配套源码,涉及Java.Docker.Kubernetes.DevOPS ...

  4. Jmeter 获取系统时间

    ${__time(yyyy-MM-dd HH:mm:ss:SSS,time)} :格式化生成时间格式 2020-11-03 21:59:13:658

  5. GXOI2018 滚粗记

    今天考了一次蜜汁省选,滚粗了.想了想,还是写点什么记录一下 8:10 折腾一番总算拿到题目和样例了,一打开dpf,立马感觉到了不对劲. 题目一股浓浓的劣质模拟题的画风,先不说题目质量,单是排版质量都被 ...

  6. Java-GUI基础(三)java.swing

    1. 简介 swing与awt:可以认为awt是swing的前身,awt即Abstrace Window Toolkit抽象窗口工具包,swing是为了解决awt在开发中的问题而开发的,是awt的改良 ...

  7. Hash 算法与 Manacher 算法

    目录 前言 简单介绍 简述 Hash 冲突 离散化 基本结构 普通 Hash 简述 例题 字符串 Hash 简单介绍 核心思想 基本运算 二维字符串 Hash 例题 兔子与兔子 回文子串的最大长度 后 ...

  8. Git的介绍及使用

    一.配置用户信息: 配置用户名和邮箱: $ git config --global user.name "chunyu" $ git config --global user.em ...

  9. Spring Cloud 纯干货,从入门到实战

    导读 之前写过一篇SpringCloud从入门到精通的点我直达,微服务基础知识点我直达,今天我们使用Spring Cloud模拟一个电商项目.分别有以下2个服务,商品.订单.下面我们开始叭 技术栈 S ...

  10. 【Android 直播软件开发:音视频硬解码篇】

    开篇 炙手可热,望而生畏的音视频开发 时至今日,短视频App可谓是如日中天,一片兴兴向荣.随着短视频的兴起,音视频开发也越来越受到重视,但是由于音视频开发涉及知识面比较广,入门门槛相对较高,让许许多多 ...