C语言:条件编译及预定义符号知识详解

一.预定义符号
c标准定义了如下五个预处理符号
在文件输入输出以及输出日志等场合下我们会用到这些预处理符号,比如
\+回车 : 续行符,转义字符,后面不能加任何除回车之外的字符,否则会报错
二.#define关键字
#define有两个作用,一个是定义标识符,第二个是定义宏
1.定义标识符
不要在define定义的标识符里加分号
2.定义宏
#define机制包括一个规定,允许把参数替换到文本中,这种实现通常叫做宏或定义宏
宏定义永远不要吝啬括号,防止因为优先级的问题导致出现不可思议的后果 宏不能实现递归 宏只文本替换,并不简化计算 字符串中的内容不会发生宏替换
3.#和 ##
编译器会自动就两个相邻字符串自动连接成一个
#:把参数插入到字符串中
#a -> “a”
##可以把位于它两边的符号拼成一个符号
4.宏和函数对比
①宏没有类型检查
没有类型检查是宏的一大特点(但同时也是不安全的隐患),可以完成很多函数不可能做到的功能
②宏没有函数的调用和返回等额外开销,效率更高,
但是当逻辑复杂并且代码量巨大时,调用和返回的开销和运算的时间相比微乎其微,可以省略
③宏单纯只是文本替换,不能进行调试,很致命
④宏可能会使代码长度增长
⑤函数的参数如果是一个表达式,会计算出表达式的结果传入参数
宏的参数如果是一个表达式,只会文本替换,不会进行计算
总结:各有千秋,小代码量使用宏,大代码量使用函数,c++中摈弃宏这一概念,使用内联,基于优缺点,最好不要使用宏
5.带有副作用的宏参数
不要给宏参数传入带有副作用的参数
6.命名约定
宏:全部大写
函数: 不全部大写
例外
#undef name //取消宏标识符name的定义
三.条件编译
1.如果定义了debug,语句执行,反之,不执行
2.条件编译
3.多分支条件编译
3.判断是否被定义
4.嵌套指令
预处理指令可以进行嵌套
四.其它
1.头文件的包含
2.#error “…”
遇到#error便会产生一个编译错误
3.strcpy();
源字符串必须以’/0’结束,返回目标字符串地址且这个函数不管目标空间是否放得下返回的目标字符串
4.assert(条件语句)
善用断言,头文件为
5.链式反应
这次函数的返回值可以作为下一个函数的参数,达到链式反应的效果
printf(“%d\n”,strlen(strcpy(p,”hello world!”)));
6.常见错误:
编译型错误
直接看编译器错误提示信息即可 链接型错误
函数名,变量名写错,库文件使用错误(第三方库) 运行时错误

突发!美国准备限制中国企业使用云服务
盘点“双11”值得入手的4款高性价比千元级智能手机
PLC梯型图的工作方式 和PLC指令表如何转换
今年台半导体股表现亮眼,家登狂涨5.5倍夺冠
XYZprinting携新款5D打印机亮相CES2020展会
C语言:条件编译及预定义符号知识详解
基于Linux2.6.30开发DS18B20的驱动程序的类型和文件操作接口函数详解
启方半导体适用于功率半导体应用的0.18微米高压BCD工艺开始量产
摩尔线程与联和东海完成多项产品兼容互认证
2017CES开幕在即:探寻未来潮流走向和可关注的项目
机械师耀M5游戏鼠标高清图赏
中国科学院微电子所在半导体器件物理领域获进展
关于门磁感知器SG6AD,它的特点有哪些
线性直流稳压电源详解之线性直流稳压电源设计电路图分析
TCL创始人谈国产高端芯片:五年后搞定5nm就很了不起
探究郭士纳让IBM起死回生的46条商业思考
“解锁”电池轻量化 结构件企业瑞德丰如何出
华为运动健康科学实验室正式亮相, 12 月 10 日在西安举办开放日活动
为IoT和可穿戴应用提供低功耗优势并有效延长电池使用寿命
丘钛科技:9月电容式指纹识别模块销量同比下降超60%