《C语言深度解刨》阅读笔记 III

本文详细讲述了C语言中的预处理技术,包括宏常量定义、错误代码管理、函数宏的使用限制、预处理指令如IFDEF、IFDEF/NEXT的使用,以及#pragma、#error和内存对齐等特殊操作符的注意事项。强调了代码结构清晰的重要性。
摘要由CSDN通过智能技术生成

第三章、预处理

  • 数值宏常量
    ①定义一些数据较长的数据,以免重复输入导致的错误。
    ②如果你在代码里不用ERROR_POWEROFF 这个宏而用-1,尤其在函数返回错误代码的时候
    (往往一个开发一个系统需要定义很多错误代码)。肯怕上帝都无法知道-1 表示的是什么意
    思吧。
  • 字符串宏常量
    ①定义字符串
    ②定义路径(有时要用到反斜杠(\)接续符,注意判断)
  • 因为注释先于预处理指令被处理,当这两行被展开成//…或/*…*/时,注释已处理完毕,此时再出现//…或/*…*/自然错误.因此,试图用宏开始或结束一段注释是不行的。
  • 宏定义表达式
    函数宏被调用时是以实参代换形参,而不是“值传递”。
    当实参为计算表达式时,代换会出错。例如#define SQR (x) x * x   假设x 的值是个表达式10+1,SQR (x)被替换后变成10+1*10+1,就会出错。处理方法是:别吝啬括号,在一切可能处加括号。
  • C的宏只能扩展为用大括号括起来的初始化、常量、小括号括起来的表达式、类型限定符、存储类型符或do-while-zero结构(尽量少用此结构)。
  • 宏不用于能定义语句或部分语句。
  • 在宏语句体的末尾必须省略分号。
  • 函数宏的调用不能缺少参数,如果此函数宏有参数的话。
  • 传递给函数宏的参数不能包含看似预处理指令的标记。
  • 在定义函数时,每个参数实例都应该用小括号括起来,除非它们做为#或##的操作数。
  • define预处理操作符只能使用两种标准形式之一。
    defined 预处理操作符的两种可允许的形式为: ①defined (identifier) ②defined identifier 
    任何其他的形式都会导致未定义的行为。
  • #undef是用来撤销宏定义的。
  • 宏不能在块中进行#define和#undef。
    C语言中,尽管在代码文件中的任何位置放置#define或#undef是合法的,但把它们放在块中会使人误解为好像它们存在于块作用域。
    通常,#define 指令要放在接近文件开始的地方,在第一个函数定义之前。而#undef 指令通常不一定需要。
  • 不要使用#undef。
    通常,#undef是不需要的。当它出现在代码中时,能使宏的存在或含义产生混乱。
  • 尽量使用普通的函数,而不要使用“宏定义函数"。可以减少代码空间的占用(ROM空间)。
  • 预处理指令中所有宏标识符在使用前都应先定义,除了#ifdef 和#ifndef指令及defined()操作符。
    如果试图在预处理指令中使用未经定义的标识符,预处理器有时不会给出任何警告,但会假定其值为零。#ifdef、#ifndef和 defined()用来测试宏是否存在并由此进行排除。

  • 所有的#else、#elif和#endif 预处理指令应该同与它们相关的#if或#ifdef指令放在相同的文件中。
    当语句块的包含和排除是被一系列预处理指令控制时,如果所有相关联的指令没有出现在同一个文件中就会产生混乱。本规则要求所有的预处理指令序列#if/#ifdef…#elif…#else…#endif 应该放在同一个文件中。遵循本规则会保持良好的代码结构并能避免维护性问题。
    注意:这并不排除把所有这样的指令放在众多被包含文件中的可能性,只要把与某一序列相关的所有指令放在一个文件中即可。
  • 在#include指令的头文件名中不应该出现非标准字符。#include指令后应紧接着<filename>或者"filename"形式的头文件。
  • #error 预处理。,编译程序时,只要遇到#error 就会生成一个编译错误提示消息,并停止编译。
  • #line 预处理。改变当前行数和文件名称,它们是在编译程序中预先定义的标识符。
  • #pragma 预处理:设定编译器的状态或者是指示编译器完成一些特定的动作,对于每个编译器都是不同的。
  • 内存对齐
  • #运算符:希望在字符串中包含宏参数,那我们就可以使用“#”,它可以把语言符号转
    化为字符串。
  • ##运算符可以用于宏函数的替换部分。这个运算符把两个语言符号组合成单个语言符号。
  • 在单一的宏定义中,最多可以出现一次“#”或“##”预处理器操作符。
  • ’#“和”##“尽量不要使用。
  • 43
    点赞
  • 32
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

七十二旹

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值