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 ...
随机推荐
- D - Beautiful Graph CodeForces - 1093D (二分图染色+方案数)
D - Beautiful Graph CodeForces - 1093D You are given an undirected unweighted graph consisting of nn ...
- python+Appium自动化:记录遇到的坑
1.打开 uiautomatorviewer同步的的时候突然报错 Error while obtaining UI hierarchy XML file: com.android.ddmlib.Syn ...
- main方法类 为何由AppClassLoader加载
AppClassLoader AppClassLoader应用类加载器,又称系统类加载器,负责在JVM启动时加载来自命令java中的classpath或者java.class.path系统属性或者CL ...
- luogu1261 服务器储存信息问题[最短路]
首先$O(n^2\log n)$暴力很好想,直接每个点出发跑一遍最短路,排$dis$统计一下即可.考虑怎么优化.发现$rank$很小,考虑从$rank$入手.换一种统计方法,看每个点$x$如果作为别的 ...
- Storm实践(二):集群搭建
集群规划 角色 IP hostname nimbus 192.168.100.101 dda supervisor 192.168.100.102 ddb supervisor 192.168.100 ...
- Web界面开发必看!Kendo UI for jQuery编辑功能指南第一弹
Kendo UI for jQuery最新试用版下载 Kendo UI目前最新提供Kendo UI for jQuery.Kendo UI for Angular.Kendo UI Support f ...
- PPM / PGM / PBM 图像文件格式[转]
下面将详细介绍ppm文件 ppm文件是一种图像文件,有其自己的文件格式.ppm文件由两个部分组成:第一个部分是三行ASCII码,这个部分决定了图像的存储格式以及图像的特征:第二个部分就是图像的数据部分 ...
- 【leetcode】1283. Find the Smallest Divisor Given a Threshold
题目如下: Given an array of integers nums and an integer threshold, we will choose a positive integer di ...
- nodeJS环境搭建
1. Node.js是什么 1.1 Node.js是一个基于Chrome V8引擎的[JavaScript运行环境]. Node.js使用了一个事件驱动.非阻塞式I/O 的模型. 1.2 Node.j ...
- 棋盘问题 ( POJ -1321 )(简单DFS)
转载请注明出处:https://blog.csdn.net/Mercury_Lc/article/details/82684942作者:Mercury_Lc 题目链接 题解:dfs入门,就是每个点都搜 ...