C基础知识(10):预处理器
C预处理器不是编译器的组成部分,但是它是编译过程中一个单独的步骤。简言之,C预处理器只不过是一个文本替换工具而已,它们会指示编译器在实际编译之前完成所需的预处理。
所有的预处理器命令都是以井号(#)开头。它必须是第一个非空字符,为了增强可读性,预处理器指令应从第一列开始。
(1) 预处理器实例
// 包含一个源代码文件(从系统库中获取 stdio.h,并添加文本到当前的源文件中)
#include <stdio.h> // 定义宏(把代码中所有的FILE_SIZE替换为20)
#define FILE_SIZE 20
// 取消已定义的宏
#undef FILE_SIZE // 如果定义了宏MESSAGE,则执行处理语句
#ifdef MESSAGE
/* Do something */
#endif
// 如果有定义宏没MESSAGE,则执行处理语句
#ifndef MESSAGE
/* Do something */
#endif // 如果给定条件为真,则编译下面代码
#if Something TRUE
/* Do something */
// 如果前面的 #if 给定条件不为真,当前条件为真,则编译下面代码
#elif Something TRUE
/* Do something */
// #if 的替代方案
#else
/* Do something */
// 结束一个 #if...#else 条件编译块
#endif
(2) 预定义宏
#include <stdio.h> // 预定义宏
int main() {
printf("File :%s\n", __FILE__); // 当前文件名,一个字符串常量 / output:TestD.c
printf("Date :%s\n", __DATE__); // 当前日期,一个以"MMM DD YYYY"格式表示的字符常量 / output:Nov 10 2017
printf("Time :%s\n", __TIME__); // 当前时间,一个以"HH:MM:SS"格式表示的字符常量 / output: 13:50:21
printf("Line :%d\n", __LINE__); // 这会包含当前行号,一个十进制常量 / output:8
printf("ANSI :%d\n", __STDC__); // 当编译器以 ANSI 标准编译时,则定义为 1 / output:1
return ;
}
(3) 预处理器运算符&参数化的宏
#include <stdio.h> // 预处理器运算符&参数化的宏
// 宏延续运算符[\] & 字符串常量化运算符[#]
#define message_between(min, max) \
printf("Size must between" #min " and " #max "!\n") // 标记粘贴运算符[##]
#define tokenpaster(n) printf("token" #n " = %d", token##n) // defined()运算符
#if !defined (MESSAGE_NOTNULL)
#define MESSAGE_NOTNULL "Message not be null!\n"
#endif // 参数化的宏(省略括号会导致运算错误)
#define MAX(x,y) ((x)>(y)?(x):(y))
#define SWAP(x,y) {x=x+y;y=x-y;x=x-y;} int main() {
message_between(, );
int token1 = ;
// 相当于: printf("token1 = %d", token1);
tokenpaster();// token1 = 40
printf(MESSAGE_NOTNULL); //Message not be null!
printf("Max number is: %d\n", MAX(, )); // Max number is: 17
int x = , y = ;
SWAP(x, y);
printf("After change: x=%d, y=%d\n", x, y); // After change: x=27, y=20
return ;
}
C基础知识(10):预处理器的更多相关文章
- 深度学习FPGA实现基础知识10(Deep Learning(深度学习)卷积神经网络(Convolutional Neural Network,CNN))
需求说明:深度学习FPGA实现知识储备 来自:http://blog.csdn.net/stdcoutzyx/article/details/41596663 说明:图文并茂,言简意赅. 自今年七月份 ...
- C# 篇基础知识10——多线程
1.线程的概念 单核CPU的计算机中,一个时刻只能执行一条指令,操作系统以“时间片轮转”的方式实现多个程序“同时”运行.操作系统以进程(Process)的方式运行应用程序,进程不但包括应用程序的指令流 ...
- JavaScript语言基础知识10
JavaScript中间if声明: <span style="font-size:18px;"><HTML> <HEAD> <TITLE& ...
- 《Java核心技术·卷Ⅰ:基础知识(原版10》学习笔记 第5章 继承
<Java核心技术·卷Ⅰ:基础知识(原版10>学习笔记 第5章 继承 目录 <Java核心技术·卷Ⅰ:基础知识(原版10>学习笔记 第5章 继承 5.1 类.超类和子类 5.1 ...
- 关于前端CSS预处理器Sass的小知识!
前面的话 "CSS预处理器"(css preprocessor)的基本思想是,用一种专门的编程语言,进行网页样式设计,然后再编译成正常的CSS文件.SASS是一种CSS的开发工 ...
- 背水一战 Windows 10 (78) - 自定义控件: 基础知识, 依赖属性, 附加属性
[源码下载] 背水一战 Windows 10 (78) - 自定义控件: 基础知识, 依赖属性, 附加属性 作者:webabcd 介绍背水一战 Windows 10 之 控件(自定义控件) 自定义控件 ...
- 背水一战 Windows 10 (76) - 控件(控件基类): Control - 基础知识, 焦点相关, 运行时获取 ControlTemplate 和 DataTemplate 中的元素
[源码下载] 背水一战 Windows 10 (76) - 控件(控件基类): Control - 基础知识, 焦点相关, 运行时获取 ControlTemplate 和 DataTemplate 中 ...
- 背水一战 Windows 10 (75) - 控件(控件基类): FrameworkElement - 基础知识, 相关事件, HorizontalAlignment, VerticalAlignment
[源码下载] 背水一战 Windows 10 (75) - 控件(控件基类): FrameworkElement - 基础知识, 相关事件, HorizontalAlignment, Vertical ...
- 背水一战 Windows 10 (63) - 控件(WebView): 基础知识, 加载 html, http, https, ms-appx-web:///, embedded resource, ms-appdata:///, ms-local-stream://
[源码下载] 背水一战 Windows 10 (63) - 控件(WebView): 基础知识, 加载 html, http, https, ms-appx-web:///, embedded res ...
随机推荐
- libusb_transfer
http://libusb.sourceforge.net/api-1.0/structlibusb__transfer.html int libusb_control_transfer(libusb ...
- IIFE 立即执行函数表达式-模块化
1)立即执行 2)表达式 3)括号,分号结束 | 前缀运算符 | 表达式上下文 4)只需要执行一次,内部变量无需维护,可用于初始化 (function( ) { })( ); 或 (function( ...
- jQuery和vue 设置ajax全局请求
一个很常见的问题,如果用户登录网站session过期,需要用户返回登录页面重新登录. 如果是http请求可以在后台设置拦截器,统一拦截并跳转.但是ajax方法并不能通过后台直接跳转. 所以我们可以写一 ...
- redis实现排行榜功能
目录 加入排行榜 操作排行榜 redis的zset可以很方便地用来实现排行榜功能,下面简单介绍python如何使用redis实现排行榜功能 加入排行榜 获取redis实例 import redis m ...
- es6的Set结构
今天看了一下es6的文档,发现还是比较实用的,Set结构可以用来数组的去重哎 let arr = [1,3,6,3,1,9] let arr1 = new Set(arr) [...arr1]的值就是 ...
- JSP页面的Page指令指定编码和Meta标签编码
JSP代码如下: <%@ page language="java" contentType="text/html; charset=UTF-8" page ...
- sql 查询列
select 'A' AS A , B ='B'
- 【Python网络】网络协议篇
OSI七层协议 互联网协议按照功能不同分为OSI七层 或 TCP/IP五层 或 TCP/IP四层 每层运行常见物理设备 TCP/IP五层模型讲解 每层都运行特定的协议,越往上越靠近用户,越往下越靠近硬 ...
- linux下ssh免秘钥登录
1.检查防火墙是否关闭 (1)切换到root用户 (2)查看防火墙状态 service iptables status 这是没有关闭 (3)设置关闭 service iptables stop 2.检 ...
- 妙味课堂——JavaScript基础课程笔记
集中时间把秒微课堂JS的基础课程看完,并且认真完成了课后练习.感觉在JS方面的技能算是入了个门了.课后练习的作业完成的代码我都汇总在了这里.至于视频课的学习笔记,则记录如下. 第01课JS入门基础_热 ...