详解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,也就不会展开。

相关文章

  • Linux下C语言实现C/S模式编程

    Linux下C语言实现C/S模式编程

    这篇文章主要为大家详细介绍了Linux下C语言实现C/S模式编程的相关资料,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2016-01-01
  • C++实现学生信息管理系统(完整版)

    C++实现学生信息管理系统(完整版)

    这篇文章主要为大家详细介绍了C++实现学生信息管理系统,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-06-06
  • 64位linux 编译c提示gnu/stubs-32.h:No such file or directory的解决方法

    64位linux 编译c提示gnu/stubs-32.h:No such file or directory的解决方法

    这篇文章主要介绍了64位linux 编译c提示gnu/stubs-32.h:No such file or directory的解决方法,需要的朋友可以参考下
    2020-03-03
  • C语言代码实现推箱子小游戏

    C语言代码实现推箱子小游戏

    这篇文章主要为大家详细介绍了C语言代码实现推箱子小游戏,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2020-12-12
  • C语言中strcpy()函数的具体实现及注意事项

    C语言中strcpy()函数的具体实现及注意事项

    C语言库函数char *strcpy(char *dest, const char *src)把src所指向的字符串复制到dest,下面这篇文章主要给大家介绍了关于C语言中strcpy()函数的具体实现及注意事项的相关资料,需要的朋友可以参考下
    2022-11-11
  • 浅析C++中的多线程编程

    浅析C++中的多线程编程

    这篇文章主要为大家详细介绍了C++中的多线程编程,包括创建线程、同步线程、传递数据给线程以及异常处理等方面,感兴趣的小伙伴可以跟随小编一起学习一下
    2023-10-10
  • C++ 实现线程安全的频率限制器(推荐)

    C++ 实现线程安全的频率限制器(推荐)

    这篇文章主要介绍了在 C++ 中实现一个线程安全的频率限制器,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-05-05
  • OpenCV实现简易标定板

    OpenCV实现简易标定板

    这篇文章主要为大家详细介绍了OpenCV实现简易标定板,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-04-04
  • 一篇文章带你了解C++中的显示转换

    一篇文章带你了解C++中的显示转换

    这篇文章主要介绍了C++11显示类型转换的优点,帮助大家更好的理解和学习c++,感兴趣的朋友可以了解下,希望能给你带来帮助
    2021-08-08
  • C++中标准线程库的基本使用介绍

    C++中标准线程库的基本使用介绍

    大家好,本篇文章主要讲的是C++中标准线程库的基本使用介绍,感兴趣的同学赶快来看一看吧,对你有帮助的话记得收藏一下
    2022-02-02

最新评论