详解C语言中的#define宏定义命令用法

 更新时间:2016年05月12日 17:36:44   作者:飞翔的猫咪  
有的时候为了程序的通用性,可以使用#define预处理宏定义命令,它的具体作用就是方便程序段的定义和修改,下面就来详解C语言中的#define宏定义命令用法.

#define
命令#define定义了一个标识符及一个串。在源程序中每次遇到该标识符时,均以定义的串代换它。ANSI标准将标识符定义为宏名,将替换过程称为宏替换。命令的一般形式为:

#define identifier string

注意:
1.该语句没有分号。在标识符和串之间可以有任意个空格,串一旦开始,仅由一新行结束。
2.宏名定义后,即可成为其它宏名定义中的一部分。
3.宏替换仅仅是以文本串代替宏标识符,前提是宏标识符必须独立的识别出来,否则不进行替换。例如:
#define XYZ this is a tes
使用宏printf("XYZ");//该段不打印"this is a test"而打印"XYZ"。因为预编译器识别出的是"XYZ"
4.如果串长于一行,可以在该行末尾用一反斜杠' \'续行。
#defineLONG_STRING"this is a very long\
string that is used as an example"
5.C语言程序普遍使用大写字母定义标识符。
6.用宏代换代替实在的函数的一大好处是宏替换增加了代码的速度,因为不存在函数调用的开销。但增加速度也有代价:由于重复编码而增加了程序长度。

宏定义的注意事项
试图使用宏去定义注释符号是不行的,例如以下代码:

#define BSC //
#define BMC /*
#define EMC */
BSC my single-line comment
BMC my multi-line comment EMC

因为注释先于预处理指令处理,当展开这些宏定义的时候自然会出现一堆错误。
宏定义表达式的时候一定不能吝啬括号。这个不用解释了。
宏定义的时候宏名中最好不要有空格。下面的定义会带来很多麻烦:

  #define SUM (x) ((x)*(x))

一旦使用了#undef撤销宏,则后面的代码都不能使用这个宏,除非再次定义。此外,如果没有#undef的情形下就直接再次定义,后来的定义会覆盖掉前面的定义。下面代码中的c值是4:

  #include <stdio.h>
 
  #define X 3
  #define Y X*2
  #undef X
  #define X 2
 
  int c = Y;
 
  int main(int argc, char** argv){
    printf("%d",c) ;
    return 0;
  }

宏仅在使用的时候展开,否则即使定义有问题,也不会编译出错。如果把上面代码中的第二个#define注释掉,并把C的值赋值为0,即撤销了X定义,也不会报错,因为没有使用Y,也就不会展开。

相关文章

  • C++数据封装以及定义结构的详细讲解

    C++数据封装以及定义结构的详细讲解

    这篇文章主要详细讲解了C++数据封装以及定义结构,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-05-05
  • 详解C语言之文件操作(上)

    详解C语言之文件操作(上)

    这篇文章主要介绍了关于C语言文件操作方法的相关资料,小编觉得这篇文章写的还不错,需要的朋友可以参考下,希望能够给你带来帮助
    2021-11-11
  • C++实现贪心算法(Greedy Algorithm)的应用场景示例

    C++实现贪心算法(Greedy Algorithm)的应用场景示例

    贪心算法是一种通过每一步选择当前最优解来推动全局最优的启发式算法,它适用于满足贪心选择性质和最优子结构的问题,但并不总是能找到全局最优解,贪心算法的关键在于设计正确的策略并证明其有效性,应用范围广泛,包括资源调度、编码压缩、路径规划和网络优化等
    2025-11-11
  • C语言实现图的最短路径Floyd算法

    C语言实现图的最短路径Floyd算法

    这篇文章主要为大家详细介绍了C语言实现图的最短路径Floyd算法,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2018-01-01
  • 关闭显示器软件代码分享

    关闭显示器软件代码分享

    这篇文章主要介绍了使用程序如何关闭显示器的代码,需要的朋友可以参考下
    2014-01-01
  • C语言实现扫雷小游戏(扩展版可选择游戏难度)

    C语言实现扫雷小游戏(扩展版可选择游戏难度)

    游戏目标是找出所有没有地雷的方格,完成游戏;要是按了有地雷的方格,游戏失败;玩家可标记雷的位置,游戏以完成时间来评高低,并且用户可以选择游戏难度
    2019-10-10
  • 基于C++详解数据结构(附带例题)

    基于C++详解数据结构(附带例题)

    数据结构作为每一个IT人不可回避的问题,本文基于C++编写,下面这篇文章主要给大家介绍了关于数据结构的相关资料,文中通过实例代码介绍的非常详细,需要的朋友可以参考下
    2022-06-06
  • C++ 获取 ros2 launch.py 参数的步骤

    C++ 获取 ros2 launch.py 参数的步骤

    这篇文章主要介绍了C++ 获取 ros2 launch.py 参数的步骤,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧
    2025-04-04
  • 浅谈在函数中返回动态的内存

    浅谈在函数中返回动态的内存

    下面小编就为大家带来一篇浅谈在函数中返回动态的内存。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2016-12-12
  • c++调用windows键盘代码详情

    c++调用windows键盘代码详情

    c++调用windows键盘有好几种方式,本文就根据列举的例子对c++调用windows键盘详细介绍并附上代码说明,需要的朋友可以参考下面文章的具体内容
    2021-09-09

最新评论