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

 更新时间:2021年11月09日 14:28:50   作者:iEucliwood  
这篇文章主要介绍了C语言程序的预处理,小编觉得这篇文章写的还不错,需要的朋友可以参考下,希望能够给你带来帮助

#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

总结

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

相关文章

  • C语言数据结构系列之树的概念结构和常见表示方法

    C语言数据结构系列之树的概念结构和常见表示方法

    本章将正式开启数据结构中 “树” 部分的讲解,本章将介绍树的概念和结构,以及树的表示方法,感兴趣的朋友进来看看吧
    2022-02-02
  • linux根据pid获取进程名和获取进程pid(c语言获取pid)

    linux根据pid获取进程名和获取进程pid(c语言获取pid)

    status文件,第一行的Name即为进程名,C程序实现根据PID获取进程名和根据进程名获取PID,大家参考使用吧
    2013-12-12
  • STL常用容器详细解析

    STL常用容器详细解析

    这里我们不涉及容器的基本操作之类,只是要讨论一下各个容器其各自的特点STL中的常用容器包括:顺序性容器(vector、deque、list)、关联容器(map、set)、容器适配器(queue、stac)
    2013-09-09
  • 利用ace的ACE_Task等类实现线程池的方法详解

    利用ace的ACE_Task等类实现线程池的方法详解

    本篇文章是对利用ace的ACE_Task等类实现线程池的方法进行了详细的分析介绍,需要的朋友参考下
    2013-05-05
  • C++实现循环队列和链式队列的示例

    C++实现循环队列和链式队列的示例

    下面小编就为大家分享一篇C++实现循环队列和链式队列的示例,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2017-12-12
  • vscode使用cmake时将命令行参数传递给调试目标的方法

    vscode使用cmake时将命令行参数传递给调试目标的方法

    这篇文章主要介绍了vscode使用cmake时将命令行参数传递给调试目标,下面介绍了一个示例,将参数first_arg, second-arg和third arg传递给程序(此处需要注意,third arg中间虽然存在空格,但是仍然被视作一个参数),需要的朋友参考下吧
    2024-03-03
  • 用C语言实现简单扫雷小游戏

    用C语言实现简单扫雷小游戏

    这篇文章主要为大家详细介绍了用C语言实现简单扫雷小游戏,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-07-07
  • C语言实现文件操作实例(简单图示讲解)

    C语言实现文件操作实例(简单图示讲解)

    与普通文件载体不同,文件是以硬盘为载体存储在计算机上的信息集合,文件可以是文本文档、图片、程序等等,下面这篇文章主要给大家介绍了关于C语言实现文件操作实例的相关资料,需要的朋友可以参考下
    2023-02-02
  • C++各种数据类型所占内存大小详解

    C++各种数据类型所占内存大小详解

    这篇文章主要介绍了C++各种数据类型所占内存大小,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2023-08-08
  • C语言内存分布与heap空间分别详细讲解

    C语言内存分布与heap空间分别详细讲解

    一个程序本质上都是由 BSS 段、data段、text段三个组成的。这种概念在当前的计算机程序设计中是非常重要的一个基本概念,并且在嵌入式系统的设计中也非常重要,牵涉到嵌入式系统执行时的内存大小分配,存储单元占用空间大小的问题
    2022-11-11

最新评论