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):预处理器的更多相关文章

  1. 深度学习FPGA实现基础知识10(Deep Learning(深度学习)卷积神经网络(Convolutional Neural Network,CNN))

    需求说明:深度学习FPGA实现知识储备 来自:http://blog.csdn.net/stdcoutzyx/article/details/41596663 说明:图文并茂,言简意赅. 自今年七月份 ...

  2. C# 篇基础知识10——多线程

    1.线程的概念 单核CPU的计算机中,一个时刻只能执行一条指令,操作系统以“时间片轮转”的方式实现多个程序“同时”运行.操作系统以进程(Process)的方式运行应用程序,进程不但包括应用程序的指令流 ...

  3. JavaScript语言基础知识10

    JavaScript中间if声明: <span style="font-size:18px;"><HTML> <HEAD> <TITLE& ...

  4. 《Java核心技术·卷Ⅰ:基础知识(原版10》学习笔记 第5章 继承

    <Java核心技术·卷Ⅰ:基础知识(原版10>学习笔记 第5章 继承 目录 <Java核心技术·卷Ⅰ:基础知识(原版10>学习笔记 第5章 继承 5.1 类.超类和子类 5.1 ...

  5. 关于前端CSS预处理器Sass的小知识!

    前面的话   "CSS预处理器"(css preprocessor)的基本思想是,用一种专门的编程语言,进行网页样式设计,然后再编译成正常的CSS文件.SASS是一种CSS的开发工 ...

  6. 背水一战 Windows 10 (78) - 自定义控件: 基础知识, 依赖属性, 附加属性

    [源码下载] 背水一战 Windows 10 (78) - 自定义控件: 基础知识, 依赖属性, 附加属性 作者:webabcd 介绍背水一战 Windows 10 之 控件(自定义控件) 自定义控件 ...

  7. 背水一战 Windows 10 (76) - 控件(控件基类): Control - 基础知识, 焦点相关, 运行时获取 ControlTemplate 和 DataTemplate 中的元素

    [源码下载] 背水一战 Windows 10 (76) - 控件(控件基类): Control - 基础知识, 焦点相关, 运行时获取 ControlTemplate 和 DataTemplate 中 ...

  8. 背水一战 Windows 10 (75) - 控件(控件基类): FrameworkElement - 基础知识, 相关事件, HorizontalAlignment, VerticalAlignment

    [源码下载] 背水一战 Windows 10 (75) - 控件(控件基类): FrameworkElement - 基础知识, 相关事件, HorizontalAlignment, Vertical ...

  9. 背水一战 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 ...

随机推荐

  1. BZOJ 1016 生成树计数

    现在给出了一个简单无向加权图.你不满足于求出这个图的最小生成树,而希望知道这个图中有多少个不同的最小生成树.(如果两颗最小生成树中至少有一条边不同,则这两个最小生成树就是不同的).由于不同的最小生成树 ...

  2. python 获取安装包apk, ipa 信息

    # -*- coding:utf-8 -*- import re import os import zipfile from biplist import * from androguard.core ...

  3. kubernetes(K8S)快速安装与配置集群搭建图文教程

    kubernetes(K8S)快速安装与配置集群搭建图文教程 作者: admin 分类: K8S 发布时间: 2018-09-16 12:20 Kubernetes是什么? 首先,它是一个全新的基于容 ...

  4. 为什么程序员一定要会用Google和Stack Overflow?

    为什么程序员一定要会用Google和Stack Overflow? https://blog.csdn.net/u012207345/article/details/81139665 StackOve ...

  5. Linux启动原理

    Linux系统启动原理 #!此文章参考某godedu,用于复习查看 centos6系统 centos6系统启动过程 1. 加载 BIOS 的硬件信息,跟据设定取得第一个可开机引导设置,如:光驱,硬盘, ...

  6. 快速傅立叶变换FFT模板

    递归版 UOJ34多项式乘法 //容易暴栈,但是很好理解 #include <cmath> #include <iostream> #include <cstdio> ...

  7. linux下安装虚拟环境

    安装pip $ wget https://bootstrap.pypa.io/get-pip.py $ python get-pip.pypython3 -m pip install --upgrad ...

  8. 【Python之路】特别篇--五句话搞定JavaScript作用域

    JavaScript的作用域一直以来是前端开发中比较难以理解的知识点,对于JavaScript的作用域主要记住几句话,走遍天下都不怕... 一.“JavaScript中无块级作用域” 在Java或C# ...

  9. 关于java代理(静态代理和动态代理)

    参考文章:http://kuangbaoxu.iteye.com/blog/193240

  10. 动态DP教程

    目录 前言 开始 更进一步 前言 最后一届NOIPTG的day2T3对于动态DP的普及起到了巨大的作用.然而我到现在还不会 开始 SP1716 GSS3 - Can you answer these ...