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. QTP(11)

    练习:录制Flight登录-打开1-10之间随机编号的订单-退出,打开完订单后,退出前,使用msgbox输出“顾客x预定了y从z到w的c类型的k张票!”说明:x是顾客姓名.y是日期.z是FlyFrom ...

  2. maven的配置和eclipse maven插件安装

    1.下载maven:http://maven.apache.org/download.cgi 2. 配置环境变量: 3. 修改maven文件夹下bin/conf/settings.xml:maven仓 ...

  3. qt libusb

    https://github.com/Kakadu/Qt_libusb https://github.com/mcvsama/libusbcc/tree/master/src/libusbcc htt ...

  4. maven将本地jar包引入本地maven仓库命令

    一.maven安装命令.cmd窗口,idea中均可 mvn install:install-file -Dfile=F:\coding2pay\pay\lib/wxpay-sdk-.jar -Dgro ...

  5. Web Api(3)

    Web API中的路由. 路由机制会把一个请求的URL映射到一个Controller上面的Action.这一点很关键.也就说你发送一个Http请求,MVC框架会解析这个请求的URL,之后尝试把它去映射 ...

  6. Java 实现的 简单WordCount功能

    githup 链接:https://gitee.com/iy2524/WordCount.git PSP表格  psp2.1  psp阶段 估计耗时(分钟)  实际耗时(分钟) Planning  计 ...

  7. (一)数据库系统概述和ER图

    1.数据库系统 数据库系统有数据库.数据库管理系统.应用系统和数据库管理员组成.数据库呢就是数据的集合,应用系统和管理员就不说了,数据库管理系统即常说的DBMS,比如我们用的mysql,oracle, ...

  8. HTML 获取class里的多个值 和 dataset的使用

    属性:classList var x = event.target; console.log(x); console.log(x.classList); 可以发现 获取了全部的class里的值 获取单 ...

  9. c++关于字符串的读入和截取

    #include<iostream>#include<string>#include<vector>using namespace std;vector<st ...

  10. 2 APIView与序列化组件

    1.入门 1.1 参考blog 官方文档:http://www.django-rest-framework.org/tutorial/quickstart/#quickstart yuan的Blog: ...