当前位置:网站首页>C专家编程 第1章 C:穿越时空的迷雾 1.3 标准I/O库和C预处理器
C专家编程 第1章 C:穿越时空的迷雾 1.3 标准I/O库和C预处理器
2022-08-01 21:00:00 【weixin_客子光阴】
标准I/O库和C预处理器
C编译器不曾实现的一些功能必须通过其他途径实现。在C语言中,它们在运行时进行处理,既可以出现在应用程序代码中,也可以出现在运行时函数库中(runtime library)。在C语言中,绝大多数库函数或辅助程序都需要显式调用。例如, C语言(必要时),程序员必须管理动态内存的使用,创建各种大小的数组,测试数组边界,进行范围检测。
C原先并没有定义I/O,而是由库函数提供。后来,这实际上成了标准机制。
可移植的I/O由Mike Lesk编写,最初出现在1972年,经过优化和裁剪后来成为标准I/O函数库。
C预处理器
倡仪者:Alan Snyder
时间:1972
实现的3个主要功能:
字符串替换。通常用于为常量提供一个符号名。
头文件包含。(一般性的声明被分离到头文件中,并且可以被许多源文件使用,虽然约定采用以.h作为头文件的扩展名)
通用代码模板的扩展。与函数不同,宏(marco)在连续几个调用中所接收的参数的类型可以不同(宏的实际参数只是按照原样输出)在宏的扩展中,空格会对扩展造成很大的影响。
//1.
#define a(y) a_expanded(y)
a(x);
被扩展为
a_expanded(x);
#define a (y) a_expanded(y)
a(x);
被扩展为
(y) a_expanded(y)(x);
你可能会以为在宏里面使用花括号就像在C语言的其他部分一样,能把多余语句组合成一条复合语句,但实际上并非如此。对于宏这样的预处理器,只应该适量使用。
//2.
/*人物:Steve Bourne
*地点:贝尔实验室
*UNIX第7版的Shell(命令解释器)
*使用预处理器使C语言看上去更像Algol-68
*/
#define STRING char *
#define IF if (
#define THEN ) {
#define ELSE } else (
#define FI ;}
#define WHILE while (
#define DO ) {
#define OD ;}
#define INT int
#define BEGIN {
#define END }
INT compare(s1, s2) STRING s1; STRING s2;
BEGIN
WHILE *s1++ == *s2
DO IF *s2++ == 0
THEN return(0)
FI
OD
return (*--s1 - *s2);
END
/*翻译,原模原样替换就行*/
int compare(s1, s2) char *s1; char *s2;
{
while (*s1++ == *s2 ) {
if (*s2++ == 0) {
return (0);
}
;}
return (*--s1 - *s2);
}
相应的C代码:
int compare(s1, s2)
char *s1, *s2;
{
while (*s1++ == *s2) {
if (*s2++ == 0) return (0);
}
return (*--s1 - *s2);
}
/*Shell不使用malloc,而是使用sbrk自行负责堆存储的管理,Steve解释说,
*他之所以采用这种特别的内存分配器,是为了提高字符串处理的效率
*/
/*Bource创立的这种C语言变体事实上促成了异想天开的国际C语言混乱代码大赛
*(The International Obfuscated C Code Competition)
*/
宏最好只用于命名常量,并未一些适当的结构提供简捷的记法。宏名应该大写,这样便很容易
与函数调用区分开来。千万不要使用C预处理器来修改语言的基础结构,因为这样一来C语言就不是C语言了。
边栏推荐
- Questions I don't know in database kernel interview(1)
- 360借条安全专家:陌生微信好友不要轻易加贷款推广多是诈骗
- 乐观锁批量跟新 纯SQL
- New graduate students, great experience in reading English literature, worthy of your collection
- Pytorch学习记录(八):生成对抗网络GAN
- 面试官:大量请求 Redis 不存在的数据,从而打倒数据库,有什么方案?
- StringTable详解 串池 性能调优 字符串拼接
- MySQL Syntax Basics
- OSG Notes: Set DO_NOT_COMPUTE_NEAR_FAR to manually calculate far and near planes
- "No title"
猜你喜欢
idea插件generateAllSetMethod一键生成set/get方法以及bean对象转换
Interview Blitz 70: What are sticky packs and half packs?How to deal with it?
[Energy Conservation Institute] Application of Intelligent Control Device in High Voltage Switchgear
仿牛客论坛项目
人工智能可信安全与评测
MySQL语法基础
excel高级绘图技巧100讲(二十二)-如何对不规则数据进行分列
KDD2022 | Self-Supervised Hypergraph Transformer Recommendation System
微信小程序云开发|个人博客小程序
StringTable详解 串池 性能调优 字符串拼接
随机推荐
tiup mirror grant
Little data on how to learn?Jida latest small learning data review, 26 PDF page covers the 269 - page document small data learning theory, method and application are expounded
】 【 nn. The Parameter () to generate and why do you want to initialize
MySQL语法基础
Pytorch框架学习记录13——利用GPU训练
MySQL Syntax Basics
Buttons with good user experience should not have hover state on mobile phones
通俗解释:什么是临床预测模型
98.嵌入式控制器EC实战 EC开发板开发完成
如何封装 cookie/localStorage/sessionStorage hook?
那些关于DOM的常见Hook封装(二)
乐观锁批量跟新 纯SQL
Pytorch学习记录(八):生成对抗网络GAN
Wildcard SSL/TLS certificate
Goroutine Leaks - The Forgotten Sender
通过这两个 hook 回顾 Set/Map 基础知识
Different operating with different locks, rounding
KDD2022 | Self-Supervised Hypergraph Transformer Recommendation System
仿牛客论坛项目
有点奇怪!访问目的网址,主机能容器却不行