博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
C和指针 (pointers on C)——第十四章:预处理器
阅读量:7286 次
发布时间:2019-06-30

本文共 1960 字,大约阅读时间需要 6 分钟。

第十四章 预处理器
我跳过了先进的指针主题的章节。

太多的技巧,太学科不适合今天的我。但我真的读,读懂。假设谁读了私下能够交流一下。有的小技巧还是非常有意思。

预处理器这一章的内容。大家肯定都用过。什么#include,#define #ifdef #undef这些,可是绝对用的不多。作为全面了解学C,还是应该都看一看。
预处理器使用方法非常讲究,用不好会失误,用好了会大大加快执行时速度(不是编译速度)。
总结:
C程序的第一个步骤就是预处理。预处理器共包括下面几个符号:
1、#define
定义宏,替换作用。

它把一个符号名与随意的字符序列联系在一起。

比如,这些字符可能是一个字面值常量、表达式或者程序语句。这个语句到末尾结束,不须要;

假设过长的话能够用一个反斜杠,如:
#define PRINT(FORMAT,VALUE) \
printf("The value of " #VALUE \
" is " FORMAT "\n", VALUE)
...
PRINT("%d", X+3);
output: The value of x+3 is 25.
这里面#VALUE相当于把一个宏參数转换为一个字符串。
有些能够用函数实现的也能够用宏实现。宏的长处就在于它与类型无关。

并且宏的运行速度快于函数。由于他不存在函数调用返回的开销,在编译的时候就已经弄好了。

缺点就是使代码过长。同一时候具有不可预測的副作用,函数在这方面更easy预測。比方可能会运行多次(意料之外),可能会涉及优先级的问题。

两者不同也在于。命名约定也不同。比方max(a,b);和MAX(a,b);
2、#ifdef #undef #endif
属于条件编译,#undef指令能够使一个原来定义好的名字被忽略。
3、#if #elif #else
这三者也属于条件编译。各自是这样。假设(#if),当满足什么条件就如何(#elif),假设都不成立就(#else)。

功能较#ifdef这组更加强大,有点儿像switch case语句。
4、#include 
实现文件包括 。

常常有这两种形式#include "XXX.h"或者#include <XXX.h>,差别在于,""是在源文件路径下的头文件,<>是库文件路径下的头文件。
文件包括能够嵌套。可是不要超过两层。

由于会造成多次包括同一个文件的危急。

有人说这个easy。添加个:
#ifdef _HEADERNAME_H
#define _HEADERNAME_H
...
#endif
这个常常出如今大型程序中,可是会添加编译速度。
5、#error,#line,#progma
#error,在编译的过程中会产生一条错误信息,新信息中包括的是你所选择的文本。
#line,告诉编译器下一输入的行号。
#progma,语法因特性而异。
警告:
1、不要在一个宏定义的末尾加上分号。

2、在宏定义中使用參数,但忘了在他们周围加上括号。
编程原则上。宏定义參数须要各种加括号的。

3、忘了在整个宏定义的两边加上括号。

2和3均会由于优先级的问题造成不可预知的错误。
编程提示:
1、避免用#define指令定义能够用函数实现的非常长序列的代码。
程序的长度会极大极大的增长!

2、在那些对表达式求值的宏中,每一个宏參数出现的地方都应该加上括号。而且在整个宏定义的两边也要加上括号。

3、避免使用#define宏创建一种新语言。

创建以后可能终于连你都不知道这样的语言是什么了。
4、採用命名约定,使程序猿非常easy看出某个标识符是否为#define宏。
5、仅仅要合适就应该使用文件包括。不必操心它的额外开销。
这个开销真的非常小,并且仅仅存在与编译中。执行中是没有的。
6、头文件仅仅应该包括一组函数或者数组的声明。
7、把不同集合的声明分离到不同的头文件里能够改善信息隐藏。
8、嵌套的#include文件使我们非常难推断源文件之间的依赖关系。

所以尽量降低#include文件的嵌套。
问题:
1、#define与字面值常量的长处。

可读性好。能够给常量起个自己能看懂的名字。
假设想改动常量的数值,仅仅须要改动define的内容即可,方便。
2、编写一个用于调试的宏,打印出随意的表达式。它被调用时应该接受两个參数。第1个是printf格式码,第2个是须要打印的表达式。

#define DEBUG_PRINT(format, value)  printf("File %s, line %d: %s = " format "\n",\
__FILE__, __LINE__, #value, value);

版权声明:本文博主原创文章,博客,未经同意不得转载。

你可能感兴趣的文章
网卡故障:弹出界面eth0: 错误:没有找到合适的设备:没有找到可用于链接System eth0 的...
查看>>
【职场酸甜苦辣咸】大龄IT女汉纸的人生抉择点
查看>>
学习笔记--配置DHCP服务器(基于接口的地址池)
查看>>
Windows Server 2008安全内幕
查看>>
[CSS]练习纯CSS实现瀑布流的几种方法
查看>>
基于Linux操作系统配置java环境及Windows操作系统配置java环境(jdk安装)
查看>>
Gamebryo实例学习之五DX9MSAATextures
查看>>
我的近况
查看>>
网站运营的4点经验
查看>>
电信运营商的流量增值——互联网广告
查看>>
查看硬盘物理序列号的程序源代码
查看>>
Debian查看启动日志
查看>>
haproxy配置详解以及动静分离的实现
查看>>
1.2 Zookeeper伪集群安装
查看>>
查看客户端域策略应用结果
查看>>
美团外卖Android平台化的复用实践
查看>>
美团即时物流的分布式系统架构设计
查看>>
流行语折射科技新活力
查看>>
Zabbix高级应用二、监控磁盘阵列、Exchange队列、DAG
查看>>
Ubuntu16.04LTS上搭建Sentry
查看>>