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. 下载好的vue项目如何在自己电脑环境上运行,步骤!!

    本文链接:https://blog.csdn.net/qq_39309900/article/details/84837659首先第一步,需要安装node.js 下载地址:https://nodejs ...

  2. 数据库——Oracle(4)

    1 Oracle中常用字符处理函数:用来处理char,varchar以及varchar2类型数据. 1)length(列名/字符串):统计当前该列的列值/字符串中字符的个数 select ename, ...

  3. Can you answer these queries I SPOJ - GSS1 (线段树维护区间连续最大值/最大连续子段和)

    You are given a sequence A[1], A[2], ..., A[N] . ( |A[i]| ≤ 15007 , 1 ≤ N ≤ 50000 ). A query is defi ...

  4. solr介绍

    solr架构图: 以下是Apache Solr的主要构建块(组件) 请求处理程序 - 发送到Apache Solr的请求由这些请求处理程序处理.请求可以是查询请求或索引更新请求.根据这些请示的要求来选 ...

  5. binlog2sql快速闪回

    https://github.com/danfengcao/binlog2sql 一.说明: DML(data manipulation language):       它们是SELECT.UPDA ...

  6. springboot与springcloud版本不对应导致报错java.lang.NoSuchMethodError: org.springframework.boot.builder.SpringApplicationBuilder.<init>([Ljava/lang/Object;)V

    springboot启动报错: 10:31:50.221 [main] ERROR org.springframework.boot.SpringApplication - Application r ...

  7. 题解 [USACO Mar08] 奶牛跑步

    [USACO Mar08] 奶牛跑步 Description Bessie准备用从牛棚跑到池塘的方法来锻炼. 但是因为她懒,她只准备沿着下坡的路跑到池塘,然后走回牛棚. Bessie也不想跑得太远,所 ...

  8. pyspark中的dataframe的观察操作

    来自于:http://www.bubuko.com/infodetail-2802814.html 1.读取: sparkDF = spark.read.csv(path) sparkDF = spa ...

  9. 通过远程 HTTP GET 请求载入信息

    jQuery.get(url, [data], [callback], [type]) 概述 通过远程 HTTP GET 请求载入信息. 这是一个简单的 GET 请求功能以取代复杂 $.ajax .请 ...

  10. JavaWeb_(Struts2框架)Servlet与Struts区别

    JavaWeb_(SSH)使用Servlet实现用户的登陆 传送门 JavaWeb_(SSH)使用Struts框架实现用户的登陆 传送门 MySQL数据库中存在Gary用户,密码为123:第一次登陆时 ...