C语言讲义——预处理
C预处理器是一个文本替换工具,在实际编译之前完成一些预先的处理。
C预处理器(C Preprocessor)简写为 CPP
预处理器命令都是以#开头,如:
#include <stdio.h>
包含源代码文件stdio.h
#define定义宏
- 代码文本替换
- 增强可读性
#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语言讲义——预处理的更多相关文章
- C语言: 预处理
1. 字符映射 键盘有多种标准规格,例如常用的IBM 104键盘标准,然而不是所有键盘都能打出像#这样的符号,因此C语言的预处理引入了字符映射机制.如果程序员要求,预处理会按照约定对源代码中的字符进行 ...
- C语言之预处理命令
/**************************************************************************** Title:C之预处理命令 Time:201 ...
- R语言数据预处理
R语言数据预处理 一.日期时间.字符串的处理 日期 Date: 日期类,年与日 POSIXct: 日期时间类,精确到秒,用数字表示 POSIXlt: 日期时间类,精确到秒,用列表表示 Sys.date ...
- C语言之预处理详解
C语言之预处理详解 纲要: 预定义符号 #define #define定义标识符 #define定义宏 #define的替换规则 #与## 几点注意#undef 带副作用的宏参数 宏和函数的对比 命名 ...
- C语言之预处理
这是2016年的最后一篇博客,年初定的计划是写12篇博客,每月一篇,1/3转载,2/3原创,看来是实现不了了! -- 题外话.今天要写的东西是C语言中的预处理器,我们常说的宏定义的用法.为什么要写这个 ...
- iOS开发系列--C语言之预处理
概述 大家都知道一个C程序的运行包括编译和链接两个阶段,其实在编译之前预处理器首先要进行预处理操作,将处理完产生的一个新的源文件进行编译.由于预处理指令是在编译之前就进行了,因此很多时候它要比在程序运 ...
- Linux C编程学习之C语言简介---预处理、宏、文件包含……
C的简介 C语言的结构极其紧凑,C语言是一种模块化的编程语言,整个程序可以分割为几个相对独立的功能模块,模块之间的相互调用和数据传递是非常方便的 C语言的表达能力十分强大.C语言兼顾了高级语言和汇编语 ...
- 【C语言入门教程】2.8 C 语言的预处理命令
预处理命令是在程序编译阶段进行执行的命令,用于编译与特定环境相关的可执行文件.预处理命令扩展了 C 语言,本节将选择其中一些常用的预处理命令进行讲解. 2.8.1 宏替换命令 宏替换命令的作用类似于对 ...
- c语言编译预处理和条件编译执行过程的理解
在C语言的程序中可包括各种以符号#开头的编译指令,这些指令称为预处理命令.预处理命令属于C语言编译器,而不是C语言的组成部分.通过预处理命令可扩展C语言程序设计的环境. 一.预处理的工作方式 1.1. ...
随机推荐
- java关键字之super
1.在子类的构造方法的第一条语句处调用其父类的构造方法: 如果父类提供了构造方法,并且父类不拥有无参构造方法,则要求子类拥有相同结构的构造方法.即,子类构造方法的参数个数和类型必须和父类的构造方法一致 ...
- 《Head First 设计模式》:迭代器模式
正文 一.定义 迭代器模式提供一种方法顺序访问一个聚合对象中的各个元素,而又不暴露其内部的表示. 要点: 迭代器模式把在元素之间游走的责任交给迭代器,而不是聚合对象.这样简化了聚合的接口和实现,也让责 ...
- NB-IoT技术的低成本因素是来源于什么
一套成熟的蜂窝物联网应用体系,涉及NB-IoT芯片.通信模组.UE.运营商网络.数据流量费用.通信协议栈.物联网平台.垂直应用软件.云平台.大数据.工程安装.运营维护等多个方面.对于物联网终端的海量部 ...
- 模拟量采集模块433Mhz LoRa无线自组网络介绍
模拟量采集模块433Mhz LoRa无线自组网络是LPWAN(低功耗广域网Low Power Wide Area Nerwork)通信技术中的一种,是美国Semtech公司采用和推广的一种基于扩频技术 ...
- SpringBoot第四集:静态资源与首页定(2020最新最易懂)
SpringBoot第四集:静态资源与首页定(2020最新最易懂) 问题 SpringBoot构建的项目结构如下:没有webapp目录,没有WEB-INF等目录,那么如果开发web项目,项目资源放在那 ...
- 删除指定路径下指定天数之前(以文件的创建日期为准)的文件:BAT + REG + Ritchie Lawrence 日期函数
代码如下: @echo off::演示:删除指定路径下指定天数之前(以文件的创建日期为准)的文件.::如果演示结果无误,把del前面的echo去掉,即可实现真正删除.::本例调用了 Ritchie L ...
- char和signed char不同编译器下的使用反思
遇到一个问题,在使用一个算法的时候出现了仿真正常,但是在使用时出现函数的返回数据只有正值的异常. 在定位算法问题的时候,由算法函数最后的返回值由后向前推,最后发现问题在与char类型的值在不同编译器下 ...
- map,filter
def is_odd(n): return n % 2 == 1 newlist = filter(is_odd, [i for i in range(0,5)]) print(list(newlis ...
- List/Set 泛型转换
Type typeSet = new TypeToken<Set<Long>>() {}.getType(); Type typeList = new TypeToken< ...
- sklearn.neighbors.NNeighborsClassifier 详细说明
平时会用到sklearn.neighbors.NNeighborsClassifier函数来构建K最邻近分类器,所以这里对NNeighborsClassifier中的参数进行说明,文中参考的是scik ...