文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

详解C语言之预处理(下)

2024-04-02 19:55

关注

#define定义宏带副作用的宏参数

我们来看如下一段代码

结果分别为12,11,13

当参数替换后,首先判断表达式 (a++)>(b++)?,判断后a的值加1 b的值加1,然后执行表达式(b++)此时执行的值为12,执行完成后b的值加1,则a的值为11,b的值为13。可以看出对于这种情况下的宏是带有副作用的,可能会导致不可预料的结果

#define定义宏的优点

实现以下代码,用函数好还是宏好?

1.用于调用函数和返回代码的时间可能比这个小型计算所需的时间更多,所以宏在速度上和规模上更胜一筹

2.函数的参数必须声明为特定的类型,所以函数只能在类型合适的表达式使用,而宏则与类型无关,所以如果比较浮点型时使用函数就会有警告

#define定义宏劣势

1.每次使用宏时,一段宏定义的代码会插入到代码中,除非宏比较短,否则将大幅增加代码的长度

2.由于存在信息差,宏是没办法调试的。我们看到的是宏定义的名字,而实际运行是宏定义的代码。例:

看似代码没错,但实际上是因为无法调试宏而找不出错误。

3.宏由于与类型无关,也就不够严谨

4.宏可能带来运算符优先级的问题,容易导致结果出错

预处理

预定义符号

__FILE__          进行编译的源文件

__DATE__        文件被编译的日期

__TIME__         文件被编译的时间

__LINE__          文件当前的行号

__STDC__         若编译器遵循ANSI C标准 则值为1,否则未定义

预处理指令

#define  宏定义

#undef  撤销已定义宏名

#include  使编译程序将另一源文件嵌入到带有#include的源文件中

#ifdef    如果定义

#ifndef    如果未定义

#endif

预处理指令为上述以及其他#开头的指令

条件编译

能够让语句选择编译或者放弃

常用于调试性的代码,删除可惜,保留又碍事,或者防止重复头文件多次编译

1.调试性代码

若未定义,则不会编译其中的代码 

2.防止重复的头文件多次编译

 

还可以用#pragma once

总结

本篇文章就到这里了,希望能够给你带来帮助,也希望您能够多多关注编程网的更多内容!

阅读原文内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     807人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     351人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     314人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     433人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     221人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯