C基础知识(10):预处理器

C预处理器不是编译器的组成部分,但是它是编译过程中一个单独的步骤。简言之,C预处理器只不过是一个文本替换工具而已,它们会指示编译器在实际编译之前完成所需的预处理。

所有的预处理器命令都是以井号(#)开头。它必须是第一个非空字符,为了增强可读性,预处理器指令应从第一列开始。

(1) 预处理器实例

 1 // 包含一个源代码文件(从系统库中获取 stdio.h,并添加文本到当前的源文件中)
 2 #include <stdio.h>
 3
 4 // 定义宏(把代码中所有的FILE_SIZE替换为20)
 5 #define FILE_SIZE 20
 6 // 取消已定义的宏
 7 #undef  FILE_SIZE
 8
 9 // 如果定义了宏MESSAGE,则执行处理语句
10 #ifdef MESSAGE
11     /* Do something */
12 #endif
13 // 如果有定义宏没MESSAGE,则执行处理语句
14 #ifndef MESSAGE
15     /* Do something */
16 #endif
17
18 // 如果给定条件为真,则编译下面代码
19 #if Something TRUE
20     /* Do something */
21 // 如果前面的 #if 给定条件不为真,当前条件为真,则编译下面代码
22 #elif Something TRUE
23     /* Do something */
24 // #if 的替代方案
25 #else
26     /* Do something */
27 // 结束一个 #if...#else 条件编译块
28 #endif

(2) 预定义宏

 1 #include <stdio.h>
 2
 3 // 预定义宏
 4 int main() {
 5     printf("File :%s\n", __FILE__); // 当前文件名,一个字符串常量 / output:TestD.c
 6     printf("Date :%s\n", __DATE__); // 当前日期,一个以"MMM DD YYYY"格式表示的字符常量 / output:Nov 10 2017
 7     printf("Time :%s\n", __TIME__); // 当前时间,一个以"HH:MM:SS"格式表示的字符常量 / output: 13:50:21
 8     printf("Line :%d\n", __LINE__); // 这会包含当前行号,一个十进制常量 / output:8
 9     printf("ANSI :%d\n", __STDC__); // 当编译器以 ANSI 标准编译时,则定义为 1 / output:1
10     return 0;
11 }

(3) 预处理器运算符&参数化的宏

 1 #include <stdio.h>
 2
 3 // 预处理器运算符&参数化的宏
 4 // 宏延续运算符[\] & 字符串常量化运算符[#]
 5 #define message_between(min, max)  6     printf("Size must between" #min " and " #max "!\n")
 7
 8 // 标记粘贴运算符[##]
 9 #define tokenpaster(n) printf("token" #n " = %d", token##n)
10
11 // defined()运算符
12 #if !defined (MESSAGE_NOTNULL)
13     #define MESSAGE_NOTNULL "Message not be null!\n"
14 #endif
15
16 // 参数化的宏(省略括号会导致运算错误)
17 #define MAX(x,y) ((x)>(y)?(x):(y))
18 #define SWAP(x,y) {x=x+y;y=x-y;x=x-y;}
19
20 int main() {
21     message_between(8, 20);
22     int token1 = 40;
23     // 相当于: printf("token1 = %d", token1);
24     tokenpaster(1);// token1 = 40
25     printf(MESSAGE_NOTNULL); //Message not be null!
26     printf("Max number is: %d\n", MAX(10, 17)); // Max number is: 17
27     int x = 20, y = 27;
28     SWAP(x, y);
29     printf("After change: x=%d, y=%d\n", x, y); // After change: x=27, y=20
30     return 0;
31 }
时间: 2024-07-31 19:32:50

C基础知识(10):预处理器的相关文章

Java语言的基础知识10

第十二章(GUI事件) 1.GUI事件的处理机制是建立交互式应用程序的关键技术,其中事件是用在程序界面上的各种操作. 2.写程序的时候对于swing的一些空间譬如jprogressbar ,jtextfield等空间在全局中声明以后,用的时候一定要new 一下,自己经常忘记(由于对java理解不深) private  JTextField textField2; textField2 = new JTextField(); 3.事件在java语言中也是一种对象 4.监听器接受到事件之后,将委托指

FPGA基础知识10(锁存器、触发器、寄存器和缓冲器的区别)

需求说明:IC设计基础 内容       :锁存器.触发器.寄存器和缓冲器的区别 来自       :时间的诗 原文:http://www.cnblogs.com/wwping/articles/2261312.html 一.锁存器 锁存器(latch)---对脉冲电平敏感,在时钟脉冲的电平作用下改变状态 锁存器是电平触发的存储单元,数据存储的动作取决于输入时钟(或者使能)信号的电平值,仅当锁存器处于使能状态时,输出才会随着数据输入发生变化. 锁存器不同于触发器,它不在锁存数据时,输出端的信号随

linux云自动化运维基础知识10(日志同步和时间同步)

####1.系统日志默认分类#### /var/log/messages    ##系统服务及日志,包括服务的信息,报错等等/var/log/secure        ##系统认证信息日志/var/log/maillog    ##系统邮件服务信息/var/log/cron        ##系统定时任务信息/var/log/boot.log    ##系统启动信息 ####2.日志管理服务rsyslog#### 1.rsyslog负责采集日志和分类存放日志2.rsyslog日志分类vim /

2017-11-5Linux基础知识(10)bash基础特性

在上一章中我们讲述了bash基础特性之命令补全和路径补全以及它的命令引用,以及讲了文件管理命令,例如:复制.移动和删除,然后我们也讲述了变量,主要围绕着存储格式.数据范围和参与运算.那么这次我们继续讲述bash的基础特性,这一次我们讲述的是文件的通配符和IO重定向等. 一.globbing:文件名通配 我们在查询某些文件的时候,通常是在该目录下进行查找,有的时候文件繁多,想找一些特定的文件就得从该目录下逐个匹配进行查找进行通配,如果没找到则显示为空,找到的话就在下面显示该匹配结果的文件或目录,那

Python基础知识10(模块与包库的安装使用)

(1)使用标准库#标准库: Python安装包里面提供的功能模块和包主要包括内置类型和函数 #比如len.int.open等 #直接使用,无需import 功能模块 #包含程序设计所需的常用的功能 #需要用import导入他们就可以使用 import timeprint(time.strftime("%Y_%m_%d %H:%M:%S")) #打印结果如下2018_06_17 11:06:16 ----------------------------------------------

[C/C++基础--笔试突击] 5.C预处理器、作用域、static、const、内存管理

概述: C预处理器处理程序的源代码,在编译器之前运行,通常以符号#开头. 还会涉及到static.const的知识点...有的和java类同...有的容易混淆T.T. 本章很多以前都没有接触过,在笔试中见过...如果有什么错误,欢迎指正~~ 5.1 C预处理器 C语言的预处理主要有三个方面的内容: 1)宏定义与宏替换: 2)文件包含: 3)条件编译. 考点比较少,讲述一下对应需要注意的地方. 宏替换的本质很简单--文本替换.关于宏定义与宏替换请注意一下几点: 1)宏名一般用大写,宏名和参数的括号

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

前面的话 ??"CSS预处理器"(css preprocessor)的基本思想是,用一种专门的编程语言,进行网页样式设计,然后再编译成正常的CSS文件.SASS是一种CSS的开发工具,提 供了许多便利的写法,大大节省了设计者的时间,使得CSS的开发,变得简单和可维护.本文将详细介绍sass的使用 定义 ??Sass是一门高于CSS的元语言,它能用来清晰地.结构化地描述文件样式,有着比普通CSS更加强大的功能.Sass能够提供更简洁.更优雅的语法,同时提供多种功能来创建可维护和管理的样式

Oracle基础知识笔记(10) 约束

大清早打开vs2008,出现这么诡异的错, 删了一个dll的就好了.如图 Oracle基础知识笔记(10) 约束

背水一战 Windows 10 (56) - 控件(集合类): ListViewBase - 基础知识, 拖动项

原文:背水一战 Windows 10 (56) - 控件(集合类): ListViewBase - 基础知识, 拖动项 [源码下载] 作者:webabcd 介绍背水一战 Windows 10 之 控件(集合类 - ListViewBase) 基础知识 拖动项 示例1.ListViewBase 的基础知识Controls/CollectionControl/ListViewBaseDemo/ListViewBaseDemo1.xaml <Page x:Class="Windows10.Con